diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index ad7759a1e5..c3ea9e0d75 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -3342,6 +3342,7 @@ DEF_CONSOLE_CMD(ConMiscDebug) IConsoleHelp(" 8: MDF_ZONING_RS_ANIMATED_TILE"); IConsoleHelp(" 10: MDF_NEWGRF_SG_SAVE_RAW"); IConsoleHelp(" 20: MDF_SPECIAL_CMDS"); + IConsoleHelp(" 40: MDF_ZONING_RS_WATER_REGION"); return true; } diff --git a/src/debug_settings.h b/src/debug_settings.h index 586d87f05e..d3b1ca32f1 100644 --- a/src/debug_settings.h +++ b/src/debug_settings.h @@ -52,6 +52,7 @@ enum MiscDebugFlags { MDF_ZONING_RS_ANIMATED_TILE, MDF_NEWGRF_SG_SAVE_RAW, MDF_SPECIAL_CMDS, + MDF_ZONING_RS_WATER_REGION, }; extern uint32_t _misc_debug_flags; diff --git a/src/pathfinder/water_regions.cpp b/src/pathfinder/water_regions.cpp index a4bdcdfbbc..a09b20a960 100644 --- a/src/pathfinder/water_regions.cpp +++ b/src/pathfinder/water_regions.cpp @@ -399,3 +399,43 @@ void InitializeWaterRegions() } } } + +uint GetWaterRegionTileDebugColourIndex(TileIndex tile) +{ + const uint32_t sub_x = TileX(tile) & WATER_REGION_EDGE_MASK; + const uint32_t sub_y = TileY(tile) & WATER_REGION_EDGE_MASK; + + auto get_edge_distance = [&](uint32_t sub) -> uint32_t { + if (sub > WATER_REGION_EDGE_LENGTH / 2) sub = WATER_REGION_EDGE_MASK - sub; + return sub; + }; + uint32_t mode = std::min(get_edge_distance(sub_x), get_edge_distance(sub_y)); + + switch (mode) { + case 0: { + const WaterRegion &wr = _water_regions[GetWaterRegionIndex(tile)]; + if (!wr.IsInitialized()) return 1; + + return 2 + wr.NumberOfPatches(); + } + + case 1: { + const WaterRegion &wr = _water_regions[GetWaterRegionIndex(tile)]; + if (!wr.IsInitialized()) return 0; + + if (wr.CountPatchLabelOccurence(1) == WATER_REGION_NUMBER_OF_TILES) return 2; + + return 0; + } + + case 2: { + const WaterRegion &wr = _water_regions[GetWaterRegionIndex(tile)]; + if (wr.IsInitialized() && wr.HasCrossRegionAqueducts()) return 9; + + return 0; + } + + default: + return 0; + } +} diff --git a/src/zoning_cmd.cpp b/src/zoning_cmd.cpp index 9dff5ae0d0..77693d4eb8 100644 --- a/src/zoning_cmd.cpp +++ b/src/zoning_cmd.cpp @@ -287,6 +287,15 @@ SpriteID TileZoneCheckTraceRestrictEvaluation(TileIndex tile, Owner owner) if (unlikely(HasBit(_misc_debug_flags, MDF_ZONING_RS_ANIMATED_TILE)) && _animated_tiles.find(tile) != _animated_tiles.end()) { return SPR_ZONING_INNER_HIGHLIGHT_YELLOW; } + if (unlikely(HasBit(_misc_debug_flags, MDF_ZONING_RS_WATER_REGION))) { + extern uint GetWaterRegionTileDebugColourIndex(TileIndex tile); + uint colour_index = GetWaterRegionTileDebugColourIndex(tile); + if (colour_index == 0) { + return ZONING_INVALID_SPRITE_ID; + } else { + return std::min(SPR_ZONING_INNER_HIGHLIGHT_RED + colour_index - 1, SPR_ZONING_INNER_HIGHLIGHT_YELLOW); + } + } return ZONING_INVALID_SPRITE_ID; }