/* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file water_regions.h Handles dividing the water in the map into regions to assist pathfinding. */ #ifndef WATER_REGIONS_H #define WATER_REGIONS_H #include "tile_type.h" #include "map_func.h" #include using TWaterRegionPatchLabel = uint8_t; using TWaterRegionIndex = uint32_t; constexpr uint32_t WATER_REGION_EDGE_LENGTH = 16; constexpr uint32_t WATER_REGION_EDGE_LENGTH_LOG = 4; static_assert(1 << WATER_REGION_EDGE_LENGTH_LOG == WATER_REGION_EDGE_LENGTH); constexpr uint32_t WATER_REGION_EDGE_MASK = WATER_REGION_EDGE_LENGTH - 1; static_assert((WATER_REGION_EDGE_LENGTH & WATER_REGION_EDGE_MASK) == 0); constexpr uint32_t WATER_REGION_NUMBER_OF_TILES = WATER_REGION_EDGE_LENGTH * WATER_REGION_EDGE_LENGTH; constexpr TWaterRegionPatchLabel INVALID_WATER_REGION_PATCH = 0; /** * Describes a single interconnected patch of water within a particular water region. */ struct WaterRegionPatchDesc { uint32_t x; ///< The X coordinate of the water region, i.e. X=2 is the 3rd water region along the X-axis uint32_t y; ///< The Y coordinate of the water region, i.e. Y=2 is the 3rd water region along the Y-axis TWaterRegionPatchLabel label; ///< Unique label identifying the patch within the region bool operator==(const WaterRegionPatchDesc &other) const { return x == other.x && y == other.y && label == other.label; } bool operator!=(const WaterRegionPatchDesc &other) const { return !(*this == other); } }; /** * Describes a single square water region. */ struct WaterRegionDesc { uint32_t x; ///< The X coordinate of the water region, i.e. X=2 is the 3rd water region along the X-axis uint32_t y; ///< The Y coordinate of the water region, i.e. Y=2 is the 3rd water region along the Y-axis WaterRegionDesc(const uint32_t x, const uint32_t y) : x(x), y(y) {} WaterRegionDesc(const WaterRegionPatchDesc &water_region_patch) : x(water_region_patch.x), y(water_region_patch.y) {} bool operator==(const WaterRegionDesc &other) const { return x == other.x && y == other.y; } bool operator!=(const WaterRegionDesc &other) const { return !(*this == other); } }; TWaterRegionIndex GetWaterRegionIndex(const WaterRegionDesc &water_region); uint32_t CalculateWaterRegionPatchHash(const WaterRegionPatchDesc &water_region_patch); TileIndex GetWaterRegionCenterTile(const WaterRegionDesc &water_region); WaterRegionDesc GetWaterRegionInfo(TileIndex tile); WaterRegionPatchDesc GetWaterRegionPatchInfo(TileIndex tile); void InvalidateWaterRegion(TileIndex tile); void DebugInvalidateAllWaterRegions(); void DebugInitAllWaterRegions(); using TVisitWaterRegionPatchCallBack = std::function; void VisitWaterRegionPatchNeighbors(const WaterRegionPatchDesc &water_region_patch, TVisitWaterRegionPatchCallBack &callback); void InitializeWaterRegions(); struct WaterRegionSaveLoadInfo { bool initialized; }; void PrintWaterRegionDebugInfo(TileIndex tile); #endif /* WATER_REGIONS_H */