Add cache checking of water regions

pull/642/head
Jonathan G Rennison 4 months ago
parent 39a0e29f90
commit b45b8e77f3

@ -16,6 +16,7 @@ enum CheckCachesFlags : uint32_t {
CHECK_CACHE_NONE = 0,
CHECK_CACHE_GENERAL = 1 << 0,
CHECK_CACHE_INFRA_TOTALS = 1 << 1,
CHECK_CACHE_WATER_REGIONS = 1 << 2,
CHECK_CACHE_ALL = UINT16_MAX,
CHECK_CACHE_EMIT_LOG = 1 << 16,
};

@ -2052,6 +2052,11 @@ void CheckCaches(bool force_check, std::function<void(const char *)> log, CheckC
}
}
if (flags & CHECK_CACHE_WATER_REGIONS) {
extern void WaterRegionCheckCaches(std::function<void(const char *)> log);
WaterRegionCheckCaches(log);
}
if ((flags & CHECK_CACHE_EMIT_LOG) && !saved_messages.empty()) {
InconsistencyExtraInfo info;
info.check_caches_result = std::move(saved_messages);

@ -260,6 +260,17 @@ public:
{
return this->wr.tile_patch_labels != nullptr;
}
TWaterRegionPatchLabelArray CopyPatchLabelArray() const
{
TWaterRegionPatchLabelArray out;
if (this->HasPatchStorage()) {
out = *this->wr.tile_patch_labels;
} else {
out.fill(this->NumberOfPatches() == 0 ? INVALID_WATER_REGION_PATCH : 1);
}
return out;
}
};
std::vector<WaterRegion> _water_regions;
@ -472,3 +483,41 @@ uint GetWaterRegionTileDebugColourIndex(TileIndex tile)
return 0;
}
}
void WaterRegionCheckCaches(std::function<void(const char *)> log)
{
char cclog_buffer[1024];
#define CCLOG(...) { \
char *cc_log_pos = cclog_buffer + seprintf(cclog_buffer, lastof(cclog_buffer), "Region: %u x %u to %u x %u: ", \
x * WATER_REGION_EDGE_LENGTH, y * WATER_REGION_EDGE_LENGTH, (x * WATER_REGION_EDGE_LENGTH) + WATER_REGION_EDGE_MASK, (y * WATER_REGION_EDGE_LENGTH) + WATER_REGION_EDGE_MASK); \
seprintf(cc_log_pos, lastof(cclog_buffer), __VA_ARGS__); \
DEBUG(desync, 0, "%s", cclog_buffer); \
if (log) log(cclog_buffer); \
}
const uint32_t size_x = GetWaterRegionMapSizeX();
const uint32_t size_y = GetWaterRegionMapSizeY();
for (uint32_t y = 0; y < size_y; y++) {
for (uint32_t x = 0; x < size_x; x++) {
WaterRegionReference wr = GetWaterRegionRef(x, y);
if (!wr.IsInitialized()) continue;
const bool old_has_cross_region_aqueducts = wr.HasCrossRegionAqueducts();
const int old_number_of_patches = wr.NumberOfPatches();
const TWaterRegionPatchLabelArray old_patch_labels = wr.CopyPatchLabelArray();
wr.ForceUpdate();
if (old_has_cross_region_aqueducts != wr.HasCrossRegionAqueducts()) {
CCLOG("Has cross region aqueducts mismatch: %u -> %u", old_has_cross_region_aqueducts, wr.HasCrossRegionAqueducts());
}
if (old_number_of_patches != wr.NumberOfPatches()) {
CCLOG("Number of patches mismatch: %u -> %u", old_number_of_patches, wr.NumberOfPatches());
}
if (old_patch_labels != wr.CopyPatchLabelArray()) {
CCLOG("Patch label mismatch");
}
}
}
#undef CCLOG
}

Loading…
Cancel
Save