OpenTTD Source 20241224-master-gf74b0cf984
water_cmd.cpp File Reference

Handling of water tiles. More...

#include "stdafx.h"
#include "landscape.h"
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
#include "news_func.h"
#include "depot_base.h"
#include "depot_func.h"
#include "water.h"
#include "industry_map.h"
#include "newgrf_canal.h"
#include "strings_func.h"
#include "vehicle_func.h"
#include "sound_func.h"
#include "company_func.h"
#include "clear_map.h"
#include "tree_map.h"
#include "aircraft.h"
#include "effectvehicle_func.h"
#include "tunnelbridge_map.h"
#include "station_base.h"
#include "ai/ai.hpp"
#include "game/game.hpp"
#include "core/random_func.hpp"
#include "core/backup_type.hpp"
#include "timer/timer_game_calendar.h"
#include "company_base.h"
#include "company_gui.h"
#include "newgrf_generic.h"
#include "industry.h"
#include "water_cmd.h"
#include "landscape_cmd.h"
#include "pathfinder/water_regions.h"
#include "table/strings.h"
#include "safeguards.h"
#include "table/water_land.h"

Go to the source code of this file.

Functions

static void MarkTileDirtyIfCanalOrRiver (TileIndex tile)
 Marks tile dirty if it is a canal or river tile.
 
static void MarkCanalsAndRiversAroundDirty (TileIndex tile)
 Marks the tiles around a tile as dirty, if they are canals or rivers.
 
void ClearNeighbourNonFloodingStates (TileIndex tile)
 Clear non-flooding state of the tiles around a tile.
 
CommandCost CmdBuildShipDepot (DoCommandFlag flags, TileIndex tile, Axis axis)
 Build a ship depot.
 
bool IsPossibleDockingTile (Tile t)
 
void CheckForDockingTile (TileIndex t)
 Mark the supplied tile as a docking tile if it is suitable for docking.
 
void MakeWaterKeepingClass (TileIndex tile, Owner o)
 
static CommandCost RemoveShipDepot (TileIndex tile, DoCommandFlag flags)
 
static CommandCost DoBuildLock (TileIndex tile, DiagDirection dir, DoCommandFlag flags)
 Builds a lock.
 
static CommandCost RemoveLock (TileIndex tile, DoCommandFlag flags)
 Remove a lock.
 
CommandCost CmdBuildLock (DoCommandFlag flags, TileIndex tile)
 Builds a lock.
 
static bool RiverModifyDesertZone (TileIndex tile, void *)
 Callback to create non-desert around a river tile.
 
void MakeRiverAndModifyDesertZoneAround (TileIndex tile)
 Make a river tile and remove desert directly around it.
 
CommandCost CmdBuildCanal (DoCommandFlag flags, TileIndex tile, TileIndex start_tile, WaterClass wc, bool diagonal)
 Build a piece of canal.
 
static CommandCost ClearTile_Water (TileIndex tile, DoCommandFlag flags)
 
bool IsWateredTile (TileIndex tile, Direction from)
 return true if a tile is a water tile wrt.
 
static void DrawWaterSprite (SpriteID base, uint offset, CanalFeature feature, TileIndex tile)
 Draw a water sprite, potentially with a NewGRF-modified sprite offset.
 
static void DrawWaterEdges (bool canal, uint offset, TileIndex tile)
 Draw canal or river edges.
 
static void DrawSeaWater (TileIndex)
 Draw a plain sea water tile with no edges.
 
static void DrawCanalWater (TileIndex tile)
 draw a canal styled water tile with dikes around
 
static void DrawWaterTileStruct (const TileInfo *ti, const DrawTileSeqStruct *dtss, SpriteID base, uint offset, PaletteID palette, CanalFeature feature)
 Draw a build sprite sequence for water tiles.
 
static void DrawWaterLock (const TileInfo *ti)
 Draw a lock tile.
 
static void DrawWaterDepot (const TileInfo *ti)
 Draw a ship depot tile.
 
static void DrawRiverWater (const TileInfo *ti)
 
void DrawShoreTile (Slope tileh)
 
void DrawWaterClassGround (const TileInfo *ti)
 
static void DrawTile_Water (TileInfo *ti)
 
void DrawShipDepotSprite (int x, int y, Axis axis, DepotPart part)
 
static int GetSlopePixelZ_Water (TileIndex tile, uint x, uint y, bool)
 
static Foundation GetFoundation_Water (TileIndex, Slope)
 
static void GetTileDesc_Water (TileIndex tile, TileDesc *td)
 
static void FloodVehicle (Vehicle *v)
 Handle the flooding of a vehicle.
 
static VehicleFloodVehicleProc (Vehicle *v, void *data)
 Flood a vehicle if we are allowed to flood it, i.e.
 
static void FloodVehicles (TileIndex tile)
 Finds a vehicle to flood.
 
FloodingBehaviour GetFloodingBehaviour (TileIndex tile)
 Returns the behaviour of a tile during flooding.
 
static void DoFloodTile (TileIndex target)
 Floods a tile.
 
static void DoDryUp (TileIndex tile)
 Drys a tile up.
 
void TileLoop_Water (TileIndex tile)
 Let a water tile floods its diagonal adjoining tiles called from tunnelbridge_cmd, and by TileLoop_Industry() and TileLoop_Track()
 
void ConvertGroundTilesIntoWaterTiles ()
 
static TrackStatus GetTileTrackStatus_Water (TileIndex tile, TransportType mode, uint, DiagDirection)
 
static bool ClickTile_Water (TileIndex tile)
 
static void ChangeTileOwner_Water (TileIndex tile, Owner old_owner, Owner new_owner)
 
static VehicleEnterTileStatus VehicleEnter_Water (Vehicle *, TileIndex, int, int)
 
static CommandCost TerraformTile_Water (TileIndex tile, DoCommandFlag flags, int, Slope)
 

Variables

static const uint8_t _flood_from_dirs []
 Describes from which directions a specific slope can be flooded (if the tile is floodable at all).
 
const TileTypeProcs _tile_type_water_procs
 

Detailed Description

Handling of water tiles.

Definition in file water_cmd.cpp.

Function Documentation

◆ ChangeTileOwner_Water()

static void ChangeTileOwner_Water ( TileIndex  tile,
Owner  old_owner,
Owner  new_owner 
)
static

Definition at line 1371 of file water_cmd.cpp.

◆ CheckForDockingTile()

void CheckForDockingTile ( TileIndex  t)

◆ ClearNeighbourNonFloodingStates()

void ClearNeighbourNonFloodingStates ( TileIndex  tile)

Clear non-flooding state of the tiles around a tile.

Parameters
tileThe centre of the tile where other tiles' non-flooding state is cleared.

Definition at line 97 of file water_cmd.cpp.

References DIR_BEGIN, DIR_END, IsTileType(), IsValidTile(), MP_WATER, SetNonFloodingWaterTile(), and TileOffsByDir().

Referenced by BuildObject(), CmdBuildBuoy(), CmdLandscapeClear(), PlantTreesOnTile(), and RemoveLock().

◆ ClearTile_Water()

static CommandCost ClearTile_Water ( TileIndex  tile,
DoCommandFlag  flags 
)
static

Definition at line 550 of file water_cmd.cpp.

◆ ClickTile_Water()

static bool ClickTile_Water ( TileIndex  tile)
static

Definition at line 1362 of file water_cmd.cpp.

◆ CmdBuildCanal()

◆ CmdBuildLock()

CommandCost CmdBuildLock ( DoCommandFlag  flags,
TileIndex  tile 
)

Builds a lock.

Parameters
flagstype of operation
tiletile where to place the lock
Returns
the cost of this operation or an error

Definition at line 435 of file water_cmd.cpp.

References DoBuildLock(), GetInclinedSlopeDirection(), GetTileSlope(), and INVALID_DIAGDIR.

◆ CmdBuildShipDepot()

◆ ConvertGroundTilesIntoWaterTiles()

void ConvertGroundTilesIntoWaterTiles ( )

Definition at line 1300 of file water_cmd.cpp.

◆ DoBuildLock()

◆ DoDryUp()

◆ DoFloodTile()

◆ DrawCanalWater()

static void DrawCanalWater ( TileIndex  tile)
static

draw a canal styled water tile with dikes around

Definition at line 781 of file water_cmd.cpp.

References _water_feature, CFF_HAS_FLAT_SPRITE, DrawWaterEdges(), DrawWaterSprite(), GetCanalSprite(), and HasBit().

◆ DrawRiverWater()

static void DrawRiverWater ( const TileInfo ti)
static

Definition at line 867 of file water_cmd.cpp.

◆ DrawSeaWater()

static void DrawSeaWater ( TileIndex  )
static

Draw a plain sea water tile with no edges.

Definition at line 775 of file water_cmd.cpp.

References DrawGroundSprite().

◆ DrawShipDepotSprite()

void DrawShipDepotSprite ( int  x,
int  y,
Axis  axis,
DepotPart  part 
)

Definition at line 956 of file water_cmd.cpp.

◆ DrawShoreTile()

void DrawShoreTile ( Slope  tileh)

Definition at line 905 of file water_cmd.cpp.

◆ DrawTile_Water()

static void DrawTile_Water ( TileInfo ti)
static

Definition at line 932 of file water_cmd.cpp.

◆ DrawWaterClassGround()

void DrawWaterClassGround ( const TileInfo ti)

Definition at line 922 of file water_cmd.cpp.

◆ DrawWaterDepot()

static void DrawWaterDepot ( const TileInfo ti)
static

Draw a ship depot tile.

Definition at line 861 of file water_cmd.cpp.

References DrawWaterTileStruct(), GetShipDepotAxis(), GetShipDepotPart(), GetTileOwner(), and TileInfo::tile.

◆ DrawWaterEdges()

static void DrawWaterEdges ( bool  canal,
uint  offset,
TileIndex  tile 
)
static

Draw canal or river edges.

Parameters
canalTrue if canal edges should be drawn, false for river edges.
offsetSprite offset.
tileTile to draw.

Definition at line 722 of file water_cmd.cpp.

References DIR_E, DIR_N, DIR_NE, DIR_NW, DIR_S, DIR_SE, DIR_SW, DIR_W, DrawWaterSprite(), GetCanalSprite(), IsWateredTile(), and TileAddXY().

Referenced by DrawCanalWater().

◆ DrawWaterLock()

◆ DrawWaterSprite()

static void DrawWaterSprite ( SpriteID  base,
uint  offset,
CanalFeature  feature,
TileIndex  tile 
)
static

Draw a water sprite, potentially with a NewGRF-modified sprite offset.

Parameters
baseSprite base.
offsetSprite offset.
featureThe type of sprite that is drawn.
tileTile index to draw.

Definition at line 707 of file water_cmd.cpp.

References DrawGroundSprite(), and GetCanalSpriteOffset().

Referenced by DrawCanalWater(), and DrawWaterEdges().

◆ DrawWaterTileStruct()

static void DrawWaterTileStruct ( const TileInfo ti,
const DrawTileSeqStruct dtss,
SpriteID  base,
uint  offset,
PaletteID  palette,
CanalFeature  feature 
)
static

Draw a build sprite sequence for water tiles.

If buildings are invisible, nothing will be drawn.

Parameters
tiTile info.
dtssSprite sequence to draw.
baseBase sprite.
offsetAdditional sprite offset.
palettePalette to use.

Definition at line 805 of file water_cmd.cpp.

References AddSortableSpriteToDraw(), DrawTileSeqStruct::delta_x, DrawTileSeqStruct::delta_z, GetCanalSpriteOffset(), IsInvisibilitySet(), DrawTileSeqStruct::IsTerminator(), IsTransparencySet(), PalSpriteID::sprite, TileInfo::tile, TO_BUILDINGS, TileInfo::x, TileInfo::y, and TileInfo::z.

Referenced by DrawWaterDepot(), and DrawWaterLock().

◆ FloodVehicle()

static void FloodVehicle ( Vehicle v)
static

Handle the flooding of a vehicle.

This sets the vehicle state to crashed, creates a newsitem and dirties the necessary windows.

Parameters
vThe vehicle to flood.

Definition at line 1005 of file water_cmd.cpp.

References _settings_client, Vehicle::Crash(), CreateEffectVehicleRel(), SoundSettings::disaster, EV_EXPLOSION_LARGE, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, Game::NewEvent(), AI::NewEvent(), NT_ACCIDENT, Vehicle::owner, SetDParam(), SND_12_EXPLOSION, ClientSettings::sound, and Vehicle::tile.

Referenced by FloodVehicleProc().

◆ FloodVehicleProc()

static Vehicle * FloodVehicleProc ( Vehicle v,
void *  data 
)
static

Flood a vehicle if we are allowed to flood it, i.e.

when it is on the ground.

Parameters
vThe vehicle to test for flooding.
dataThe z of level to flood.
Returns
nullptr as we always want to remove everything.

Definition at line 1023 of file water_cmd.cpp.

References AIR_SHADOW, Station::airport, AirportFTAClass::delta_z, Vehicle::First(), FloodVehicle(), BaseStation::GetByTile(), Airport::GetFTA(), GetTileMaxZ(), IsAirportTile(), Vehicle::subtype, Vehicle::tile, BaseVehicle::type, VEH_AIRCRAFT, VEH_ROAD, VEH_TRAIN, Vehicle::vehstatus, VS_CRASHED, and Vehicle::z_pos.

Referenced by FloodVehicles().

◆ FloodVehicles()

static void FloodVehicles ( TileIndex  tile)
static

Finds a vehicle to flood.

It does not find vehicles that are already crashed on bridges, i.e. flooded.

Parameters
tilethe tile where to find a vehicle to flood

Definition at line 1061 of file water_cmd.cpp.

References Station::airport, FindVehicleOnPos(), FloodVehicleProc(), GetBridgePixelHeight(), BaseStation::GetByTile(), GetOtherBridgeEnd(), IsAirportTile(), and IsBridgeTile().

Referenced by DoFloodTile().

◆ GetFloodingBehaviour()

FloodingBehaviour GetFloodingBehaviour ( TileIndex  tile)

◆ GetFoundation_Water()

static Foundation GetFoundation_Water ( TileIndex  ,
Slope   
)
static

Definition at line 972 of file water_cmd.cpp.

◆ GetSlopePixelZ_Water()

static int GetSlopePixelZ_Water ( TileIndex  tile,
uint  x,
uint  y,
bool   
)
static

Definition at line 965 of file water_cmd.cpp.

◆ GetTileDesc_Water()

static void GetTileDesc_Water ( TileIndex  tile,
TileDesc td 
)
static

Definition at line 977 of file water_cmd.cpp.

◆ GetTileTrackStatus_Water()

static TrackStatus GetTileTrackStatus_Water ( TileIndex  tile,
TransportType  mode,
uint  ,
DiagDirection   
)
static

Definition at line 1335 of file water_cmd.cpp.

◆ IsPossibleDockingTile()

bool IsPossibleDockingTile ( Tile  t)

Definition at line 173 of file water_cmd.cpp.

◆ IsWateredTile()

◆ MakeRiverAndModifyDesertZoneAround()

void MakeRiverAndModifyDesertZoneAround ( TileIndex  tile)

Make a river tile and remove desert directly around it.

Parameters
tileThe tile to change into river and create non-desert around

Definition at line 454 of file water_cmd.cpp.

References CircularTileSearch(), MakeRiver(), MarkTileDirtyByTile(), RIVER_OFFSET_DESERT_DISTANCE, and RiverModifyDesertZone().

Referenced by FlowRiver(), MakeLake(), and RiverMakeWider().

◆ MakeWaterKeepingClass()

void MakeWaterKeepingClass ( TileIndex  tile,
Owner  o 
)

Definition at line 219 of file water_cmd.cpp.

◆ MarkTileDirtyIfCanalOrRiver()

static void MarkTileDirtyIfCanalOrRiver ( TileIndex  tile)
inlinestatic

Marks tile dirty if it is a canal or river tile.

Called to avoid glitches when flooding tiles next to canal tile.

Parameters
tiletile to check

Definition at line 75 of file water_cmd.cpp.

References IsCanal(), IsRiver(), IsTileType(), IsValidTile(), MarkTileDirtyByTile(), and MP_WATER.

Referenced by MarkCanalsAndRiversAroundDirty().

◆ RemoveLock()

◆ RemoveShipDepot()

static CommandCost RemoveShipDepot ( TileIndex  tile,
DoCommandFlag  flags 
)
static

Definition at line 270 of file water_cmd.cpp.

◆ RiverModifyDesertZone()

static bool RiverModifyDesertZone ( TileIndex  tile,
void *   
)
static

Callback to create non-desert around a river tile.

Definition at line 444 of file water_cmd.cpp.

References GetTropicZone(), SetTropicZone(), TROPICZONE_DESERT, and TROPICZONE_NORMAL.

Referenced by CmdBuildCanal(), and MakeRiverAndModifyDesertZoneAround().

◆ TerraformTile_Water()

static CommandCost TerraformTile_Water ( TileIndex  tile,
DoCommandFlag  flags,
int  ,
Slope   
)
static

Definition at line 1412 of file water_cmd.cpp.

◆ TileLoop_Water()

void TileLoop_Water ( TileIndex  tile)

Let a water tile floods its diagonal adjoining tiles called from tunnelbridge_cmd, and by TileLoop_Industry() and TileLoop_Track()

Parameters
tilethe water/shore tile that floods

Definition at line 1245 of file water_cmd.cpp.

References _flood_from_dirs, AddTileIndexDiffCWrap(), AmbientSoundEffect(), DIR_BEGIN, DIR_END, DoDryUp(), DoFloodTile(), FLOOD_ACTIVE, FLOOD_DRYUP, FLOOD_PASSIVE, GetFloodingBehaviour(), GetFoundationSlope(), GetTreeGround(), HasBit(), INVALID_TILE, IsBuoy(), IsDock(), IsNonFloodingWaterTile(), IsTileType(), IsValidTile(), MP_STATION, MP_TREES, MP_WATER, ReverseDir(), SetNonFloodingWaterTile(), SLOPE_HALFTILE_MASK, SLOPE_STEEP, TileIndexDiffCByDir(), and TREE_GROUND_SHORE.

◆ VehicleEnter_Water()

static VehicleEnterTileStatus VehicleEnter_Water ( Vehicle ,
TileIndex  ,
int  ,
int   
)
static

Definition at line 1407 of file water_cmd.cpp.

Variable Documentation

◆ _flood_from_dirs

const uint8_t _flood_from_dirs[]
static
Initial value:
= {
(1 << DIR_NW) | (1 << DIR_SW) | (1 << DIR_SE) | (1 << DIR_NE),
(1 << DIR_NE) | (1 << DIR_SE),
(1 << DIR_NW) | (1 << DIR_NE),
(1 << DIR_NE),
(1 << DIR_NW) | (1 << DIR_SW),
0,
(1 << DIR_NW),
(1 << DIR_N ) | (1 << DIR_NW) | (1 << DIR_NE),
(1 << DIR_SW) | (1 << DIR_SE),
(1 << DIR_SE),
0,
(1 << DIR_E ) | (1 << DIR_NE) | (1 << DIR_SE),
(1 << DIR_SW),
(1 << DIR_S ) | (1 << DIR_SW) | (1 << DIR_SE),
(1 << DIR_W ) | (1 << DIR_SW) | (1 << DIR_NW),
}
@ DIR_SW
Southwest.
@ DIR_NW
Northwest.
@ DIR_N
North.
@ DIR_SE
Southeast.
@ DIR_S
South.
@ DIR_NE
Northeast.
@ DIR_W
West.
@ DIR_E
East.

Describes from which directions a specific slope can be flooded (if the tile is floodable at all).

Definition at line 51 of file water_cmd.cpp.

Referenced by TileLoop_Water().

◆ _tile_type_water_procs

const TileTypeProcs _tile_type_water_procs
extern
Initial value:
= {
DrawTile_Water,
GetSlopePixelZ_Water,
ClearTile_Water,
nullptr,
GetTileDesc_Water,
GetTileTrackStatus_Water,
ClickTile_Water,
nullptr,
ChangeTileOwner_Water,
nullptr,
VehicleEnter_Water,
GetFoundation_Water,
TerraformTile_Water,
}
void TileLoop_Water(TileIndex tile)
Let a water tile floods its diagonal adjoining tiles called from tunnelbridge_cmd,...

Definition at line 54 of file landscape.cpp.