From 12b20376b355e8b5b81c93a2bd9012ead9113ecd Mon Sep 17 00:00:00 2001
From: Jonathan G Rennison enable_draw_snowy_rocks 0 or 1
+
+ Enable drawing of rock tiles covered by snow, for this GRF.
+
+ (This only takes effect from new_landscape version 2).
+ New Landscape Variables
diff --git a/docs/newgrf-newlandscape.html b/docs/newgrf-newlandscape.html
index 8362461d75..fec1a251d2 100644
--- a/docs/newgrf-newlandscape.html
+++ b/docs/newgrf-newlandscape.html
@@ -48,6 +48,7 @@
Mappable name Size in bytes Description
+ newlandscape_enable_recolour 1 Enable recolour newlandscape_enable_draw_snowy_rocks 1 Enable drawing rocky tiles covered by snow Enable recolouring for new landscape graphics (mappable property: newlandscape_enable_recolour)
@@ -59,6 +60,11 @@
The property length is 1 byte. 0 is disabled (default). 1 is enabled.
+When enabled, drawing of rocky tiles covered by snow is enabled for this GRF.
+The property length is 1 byte. 0 is disabled (default). 1 is enabled.
+ This requires new_landscape, version 2.
See the Action 2 Specification for background information.
diff --git a/src/clear_cmd.cpp b/src/clear_cmd.cpp index 7286e03667..71b7f91deb 100644 --- a/src/clear_cmd.cpp +++ b/src/clear_cmd.cpp @@ -81,22 +81,22 @@ inline SpriteID GetSpriteIDForRocksUsingOffset(const uint slope_to_sprite_offset return ((HasGrfMiscBit(GMB_SECOND_ROCKY_TILE_SET) && (TileHash(x, y) & 1)) ? SPR_FLAT_ROCKY_LAND_2 : SPR_FLAT_ROCKY_LAND_1) + slope_to_sprite_offset; } -void DrawCustomSpriteIDForRocks(const TileInfo *ti) +bool DrawCustomSpriteIDForRocks(const TileInfo *ti, uint8 slope_to_sprite_offset, bool require_snow_flag) { - uint8 slope_to_sprite_offset = SlopeToSpriteOffset(ti->tileh); - for (const GRFFile *grf : _new_landscape_rocks_grfs) { + if (require_snow_flag && !HasBit(grf->new_landscape_ctrl_flags, NLCF_ROCKS_DRAW_SNOWY_ENABLED)) continue; + NewLandscapeResolverObject object(grf, ti, NEW_LANDSCAPE_ROCKS); const SpriteGroup *group = object.Resolve(); if (group != nullptr && group->GetNumResults() > slope_to_sprite_offset) { PaletteID pal = HasBit(grf->new_landscape_ctrl_flags, NLCF_ROCKS_RECOLOUR_ENABLED) ? GB(GetRegister(0x100), 0, 24) : PAL_NONE; DrawGroundSprite(group->GetResult() + slope_to_sprite_offset, pal); - return; + return true; } } - DrawGroundSprite(GetSpriteIDForRocksUsingOffset(slope_to_sprite_offset, ti->x, ti->y), PAL_NONE); + return false; } SpriteID GetSpriteIDForFields(const Slope slope, const uint field_type) @@ -104,6 +104,11 @@ SpriteID GetSpriteIDForFields(const Slope slope, const uint field_type) return _clear_land_sprites_farmland[field_type] + SlopeToSpriteOffset(slope); } +inline SpriteID GetSpriteIDForSnowDesertUsingOffset(const uint slope_to_sprite_offset, const uint density) +{ + return _clear_land_sprites_snow_desert[density] + slope_to_sprite_offset; +} + SpriteID GetSpriteIDForSnowDesert(const Slope slope, const uint density) { return _clear_land_sprites_snow_desert[density] + SlopeToSpriteOffset(slope); @@ -162,7 +167,9 @@ static void DrawTile_Clear(TileInfo *ti, DrawTileProcParams params) case CLEAR_ROCKS: if (!params.no_ground_tiles) { - DrawCustomSpriteIDForRocks(ti); + uint8 slope_to_sprite_offset = SlopeToSpriteOffset(ti->tileh); + if (DrawCustomSpriteIDForRocks(ti, slope_to_sprite_offset, false)) break; + DrawGroundSprite(GetSpriteIDForRocksUsingOffset(slope_to_sprite_offset, ti->x, ti->y), PAL_NONE); } break; @@ -174,6 +181,15 @@ static void DrawTile_Clear(TileInfo *ti, DrawTileProcParams params) break; case CLEAR_SNOW: + if (!params.no_ground_tiles) { + uint8 slope_to_sprite_offset = SlopeToSpriteOffset(ti->tileh); + if (GetRawClearGround(ti->tile) == CLEAR_ROCKS && !_new_landscape_rocks_grfs.empty()) { + if (DrawCustomSpriteIDForRocks(ti, slope_to_sprite_offset, true)) break; + } + DrawGroundSprite(GetSpriteIDForSnowDesertUsingOffset(slope_to_sprite_offset, GetClearDensity(ti->tile)), PAL_NONE); + } + break; + case CLEAR_DESERT: if (!params.no_ground_tiles) DrawGroundSprite(GetSpriteIDForSnowDesert(ti->tileh, GetClearDensity(ti->tile)), PAL_NONE); break; diff --git a/src/newgrf.cpp b/src/newgrf.cpp index f9b0a57a6a..14c5ee10e0 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -5183,6 +5183,15 @@ static ChangeInfoResult NewLandscapeChangeInfo(uint id, int numinfo, int prop, c break; } + case A0RPI_NEWLANDSCAPE_ENABLE_DRAW_SNOWY_ROCKS: { + if (MappedPropertyLengthMismatch(buf, 1, mapping_entry)) break; + bool enabled = (buf->ReadByte() != 0 ? 1 : 0); + if (id == NLA3ID_CUSTOM_ROCKS) { + SB(_cur.grffile->new_landscape_ctrl_flags, NLCF_ROCKS_DRAW_SNOWY_ENABLED, 1, enabled); + } + break; + } + default: ret = HandleAction0PropertyDefault(buf, prop); break; diff --git a/src/newgrf.h b/src/newgrf.h index 428a5c13d2..e56688f6b3 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -286,8 +286,9 @@ enum NewSignalAction3ID { /** New landscape control flags. */ enum NewLandscapeCtrlFlags { - NLCF_ROCKS_SET = 0, ///< Custom landscape rocks sprites group set. - NLCF_ROCKS_RECOLOUR_ENABLED = 1, ///< Recolour sprites enabled for rocks + NLCF_ROCKS_SET = 0, ///< Custom landscape rocks sprites group set. + NLCF_ROCKS_RECOLOUR_ENABLED = 1, ///< Recolour sprites enabled for rocks + NLCF_ROCKS_DRAW_SNOWY_ENABLED = 2, ///< Enable drawing rock tiles on snow }; /** New landscape action 3 IDs. */ diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 3c4a2ba95d..24c5c84380 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -1172,7 +1172,7 @@ GrfSpecFeature GetGrfSpecFeature(TileIndex tile) switch (GetTileType(tile)) { default: return GSF_INVALID; case MP_CLEAR: - if (IsClearGround(tile, CLEAR_ROCKS)) return GSF_NEWLANDSCAPE; + if (GetRawClearGround(tile) == CLEAR_ROCKS) return GSF_NEWLANDSCAPE; return GSF_INVALID; case MP_RAILWAY: { extern std::vector