changeset 14210:c438d8b160ea draft

(svn r18761) -Fix [FS#3497]: Spritelayouts do not need an Action 1 if only using default sprites.
author frosch <frosch@openttd.org>
date Fri, 08 Jan 2010 20:42:12 +0000
parents a78315ee7acb
children 399fc82bd809
files src/newgrf.cpp src/newgrf_house.cpp src/newgrf_industrytiles.cpp
diffstat 3 files changed, 28 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -2908,13 +2908,15 @@
 
 				case GSF_TOWNHOUSE:
 				case GSF_INDUSTRYTILES: {
-					byte num_sprite_sets      = _cur_grffile->spriteset_numents;
+					byte num_spriteset_ents   = _cur_grffile->spriteset_numents;
+					byte num_spritesets       = _cur_grffile->spriteset_numsets;
 					byte num_building_sprites = max((uint8)1, type);
 					uint i;
 
 					TileLayoutSpriteGroup *group = new TileLayoutSpriteGroup();
 					act_group = group;
-					group->num_building_stages = num_sprite_sets;
+					/* num_building_stages should be 1, if we are only using non-custom sprites */
+					group->num_building_stages = max((uint8)1, num_spriteset_ents);
 					group->dts = CallocT<DrawTileSprites>(1);
 
 					/* Groundsprite */
@@ -2927,9 +2929,16 @@
 					if (HasBit(group->dts->ground.pal, 15)) {
 						/* Bit 31 set means this is a custom sprite, so rewrite it to the
 						 * last spriteset defined. */
-						SpriteID sprite = _cur_grffile->spriteset_start + GB(group->dts->ground.sprite, 0, 14) * num_sprite_sets;
-						SB(group->dts->ground.sprite, 0, SPRITE_WIDTH, sprite);
-						ClrBit(group->dts->ground.pal, 15);
+						uint spriteset = GB(group->dts->ground.sprite, 0, 14);
+						if (num_spriteset_ents == 0 || spriteset >= num_spritesets) {
+							grfmsg(1, "NewSpriteGroup: Spritelayout uses undefined custom spriteset %d", spriteset);
+							group->dts->ground.sprite = SPR_IMG_QUERY;
+							group->dts->ground.pal = PAL_NONE;
+						} else {
+							SpriteID sprite = _cur_grffile->spriteset_start + spriteset * num_spriteset_ents;
+							SB(group->dts->ground.sprite, 0, SPRITE_WIDTH, sprite);
+							ClrBit(group->dts->ground.pal, 15);
+						}
 					}
 
 					group->dts->seq = CallocT<DrawTileSeqStruct>(num_building_sprites + 1);
@@ -2947,9 +2956,16 @@
 						if (HasBit(seq->image.pal, 15)) {
 							/* Bit 31 set means this is a custom sprite, so rewrite it to the
 							 * last spriteset defined. */
-							SpriteID sprite = _cur_grffile->spriteset_start + GB(seq->image.sprite, 0, 14) * num_sprite_sets;
-							SB(seq->image.sprite, 0, SPRITE_WIDTH, sprite);
-							ClrBit(seq->image.pal, 15);
+							uint spriteset = GB(seq->image.sprite, 0, 14);
+							if (num_spriteset_ents == 0 || spriteset >= num_spritesets) {
+								grfmsg(1, "NewSpriteGroup: Spritelayout uses undefined custom spriteset %d", spriteset);
+								seq->image.sprite = SPR_IMG_QUERY;
+								seq->image.pal = PAL_NONE;
+							} else {
+								SpriteID sprite = _cur_grffile->spriteset_start + spriteset * num_spriteset_ents;
+								SB(seq->image.sprite, 0, SPRITE_WIDTH, sprite);
+								ClrBit(seq->image.pal, 15);
+							}
 						}
 
 						if (type > 0) {
--- a/src/newgrf_house.cpp
+++ b/src/newgrf_house.cpp
@@ -472,11 +472,11 @@
 	NewHouseResolver(&object, house_id, ti->tile, Town::GetByTile(ti->tile));
 
 	group = SpriteGroup::Resolve(hs->spritegroup, &object);
-	const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
-	if (group == NULL || group->type != SGT_TILELAYOUT || tlgroup->num_building_stages == 0) {
+	if (group == NULL || group->type != SGT_TILELAYOUT) {
 		return;
 	} else {
 		/* 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);
 		DrawTileLayout(ti, tlgroup, stage, house_id);
--- a/src/newgrf_industrytiles.cpp
+++ b/src/newgrf_industrytiles.cpp
@@ -253,11 +253,11 @@
 	NewIndustryTileResolver(&object, gfx, ti->tile, i);
 
 	group = SpriteGroup::Resolve(inds->grf_prop.spritegroup, &object);
-	const TileLayoutSpriteGroup *tlgroup = (const TileLayoutSpriteGroup *)group;
-	if (group == NULL || group->type != SGT_TILELAYOUT || tlgroup->num_building_stages == 0) {
+	if (group == NULL || group->type != SGT_TILELAYOUT) {
 		return false;
 	} else {
 		/* 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);
 		IndustryDrawTileLayout(ti, tlgroup, i->random_colour, stage, gfx);