Debug: Add debug zoning overlays for water regions

pull/642/head
Jonathan G Rennison 5 months ago
parent 936d636cdd
commit 985bd99c44

@ -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;
}

@ -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;

@ -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;
}
}

@ -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<SpriteID>(SPR_ZONING_INNER_HIGHLIGHT_RED + colour_index - 1, SPR_ZONING_INNER_HIGHLIGHT_YELLOW);
}
}
return ZONING_INVALID_SPRITE_ID;
}

Loading…
Cancel
Save