/*
 * 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 <https://www.gnu.org/licenses/old-licenses/gpl-2.0>.
 */

/** @file water.h Functions related to water management. */

#ifndef WATER_H
#define WATER_H

#include "water_map.h"
#include "economy_func.h"

/**
 * Describes the behaviour of a tile during flooding.
 */
enum class FloodingBehaviour : uint8_t {
	None, ///< The tile does not flood neighboured tiles.
	Active, ///< The tile floods neighboured tiles.
	Passive, ///< The tile does not actively flood neighboured tiles, but it prevents them from drying out.
	DryOut, ///< The tile drys out if it is not constantly flooded from neighboured tiles.
};

FloodingBehaviour GetFloodingBehaviour(TileIndex tile);
void ClearNeighbourNonFloodingStates(TileIndex tile);

void TileLoop_Water(TileIndex tile);
bool FloodHalftile(TileIndex t);

void ConvertGroundTilesIntoWaterTiles();

void DrawShipDepotSprite(int x, int y, Axis axis, DepotPart part);
void DrawWaterClassGround(const struct TileInfo *ti);
void DrawShoreTile(Slope tileh);

void MakeWaterKeepingClass(TileIndex tile, Owner o);
void CheckForDockingTile(TileIndex t);

void MakeRiverAndModifyDesertZoneAround(TileIndex tile);
void RiverMakeWider(TileIndex tile, TileIndex origin_tile);
bool RiverFlowsDown(TileIndex begin, TileIndex end);
static const uint RIVER_OFFSET_DESERT_DISTANCE = 5; ///< Circular tile search diameter to create non-desert around a river tile.

bool IsWateredTile(TileIndex tile, Direction from);

/**
 * Calculates the maintenance cost of a number of canal tiles.
 * @param num Number of canal tiles.
 * @return Total cost.
 */
inline Money CanalMaintenanceCost(uint32_t num)
{
	return (_price[Price::InfrastructureWater] * num * (1 + IntSqrt(num))) >> 6; // 6 bits scaling.
}

#endif /* WATER_H */
