OpenTTD Source  20240915-master-g3784a3d3d6
landscape.cpp File Reference
#include "stdafx.h"
#include "heightmap.h"
#include "clear_map.h"
#include "spritecache.h"
#include "viewport_func.h"
#include "command_func.h"
#include "landscape.h"
#include "void_map.h"
#include "tgp.h"
#include "genworld.h"
#include "fios.h"
#include "error_func.h"
#include "timer/timer_game_calendar.h"
#include "timer/timer_game_tick.h"
#include "water.h"
#include "effectvehicle_func.h"
#include "landscape_type.h"
#include "animated_tile_func.h"
#include "core/random_func.hpp"
#include "object_base.h"
#include "company_func.h"
#include "company_gui.h"
#include "pathfinder/aystar.h"
#include "saveload/saveload.h"
#include "framerate_type.h"
#include "landscape_cmd.h"
#include "terraform_cmd.h"
#include "station_func.h"
#include "pathfinder/water_regions.h"
#include "table/strings.h"
#include "table/sprites.h"
#include "safeguards.h"
#include "table/genland.h"

Go to the source code of this file.

Data Structures

struct  River_UserData
 Parameters for river generation to pass as AyStar user data. More...
 

Macros

#define SET_MARK(x)   marks.insert(x)
 
#define IS_MARKED(x)   (marks.find(x) != marks.end())
 

Functions

Point InverseRemapCoords2 (int x, int y, bool clamp_to_map, bool *clamped)
 Map 2D viewport or smallmap coordinate to 3D world or tile coordinate. More...
 
uint ApplyFoundationToSlope (Foundation f, Slope &s)
 Applies a foundation to a slope. More...
 
uint GetPartialPixelZ (int x, int y, Slope corners)
 Determines height at given coordinate of a slope. More...
 
int GetSlopePixelZ (int x, int y, bool ground_vehicle)
 Return world Z coordinate of a given point of a tile. More...
 
int GetSlopePixelZOutsideMap (int x, int y)
 Return world z coordinate of a given point of a tile, also for tiles outside the map (virtual "black" tiles). More...
 
int GetSlopeZInCorner (Slope tileh, Corner corner)
 Determine the Z height of a corner relative to TileZ. More...
 
void GetSlopePixelZOnEdge (Slope tileh, DiagDirection edge, int &z1, int &z2)
 Determine the Z height of the corners of a specific tile edge. More...
 
std::tuple< Slope, int > GetFoundationSlope (TileIndex tile)
 Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTileSlope. More...
 
bool HasFoundationNW (TileIndex tile, Slope slope_here, uint z_here)
 
bool HasFoundationNE (TileIndex tile, Slope slope_here, uint z_here)
 
void DrawFoundation (TileInfo *ti, Foundation f)
 Draw foundation f at tile ti. More...
 
void DoClearSquare (TileIndex tile)
 
TrackStatus GetTileTrackStatus (TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
 Returns information about trackdirs and signal states. More...
 
void ChangeTileOwner (TileIndex tile, Owner old_owner, Owner new_owner)
 Change the owner of a tile. More...
 
void GetTileDesc (TileIndex tile, TileDesc *td)
 
bool IsSnowLineSet ()
 Has a snow line table already been loaded. More...
 
void SetSnowLine (uint8_t table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS])
 Set a variable snow line, as loaded from a newgrf file. More...
 
uint8_t GetSnowLine ()
 Get the current snow line, either variable or static. More...
 
uint8_t HighestSnowLine ()
 Get the highest possible snow line height, either variable or static. More...
 
uint8_t LowestSnowLine ()
 Get the lowest possible snow line height, either variable or static. More...
 
void ClearSnowLine ()
 Clear the variable snow line table and free the memory.
 
CommandCost CmdLandscapeClear (DoCommandFlag flags, TileIndex tile)
 Clear a piece of landscape. More...
 
std::tuple< CommandCost, MoneyCmdClearArea (DoCommandFlag flags, TileIndex tile, TileIndex start_tile, bool diagonal)
 Clear a big piece of landscape. More...
 
void RunTileLoop ()
 Gradually iterate over all tiles on the map, calling their TileLoopProcs once every TILE_UPDATE_FREQUENCY ticks.
 
void InitializeLandscape ()
 
static void GenerateTerrain (int type, uint flag)
 
static void CreateDesertOrRainForest (uint desert_tropic_line)
 
static bool FindSpring (TileIndex tile, void *)
 Find the spring of a river. More...
 
static bool MakeLake (TileIndex tile, void *user_data)
 Make a connected lake; fill all tiles in the circular tile search that are connected. More...
 
static bool RiverMakeWider (TileIndex tile, void *data)
 Widen a river by expanding into adjacent tiles via circular tile search. More...
 
static bool FlowsDown (TileIndex begin, TileIndex end)
 Check whether a river at begin could (logically) flow down to end. More...
 
static int32_t River_EndNodeCheck (const AyStar *aystar, const PathNode *current)
 
static int32_t River_CalculateG (AyStar *, AyStarNode *, PathNode *)
 
static int32_t River_CalculateH (AyStar *aystar, AyStarNode *current, PathNode *)
 
static void River_GetNeighbours (AyStar *aystar, PathNode *current)
 
static void River_FoundEndNode (AyStar *aystar, PathNode *current)
 
static void BuildRiver (TileIndex begin, TileIndex end, TileIndex spring, bool main_river)
 Actually build the river between the begin and end tiles using AyStar. More...
 
static std::tuple< bool, bool > FlowRiver (TileIndex spring, TileIndex begin, uint min_river_length)
 Try to flow the river down from a given begin. More...
 
static void CreateRivers ()
 Actually (try to) create some rivers.
 
static uint CalculateCoverageLine (uint coverage, uint edge_multiplier)
 Calculate what height would be needed to cover N% of the landmass. More...
 
static void CalculateSnowLine ()
 Calculate the line from which snow begins.
 
static uint8_t CalculateDesertLine ()
 Calculate the line (in height) between desert and tropic. More...
 
bool GenerateLandscape (uint8_t mode)
 
void OnTick_Town ()
 Iterate through all towns and call their tick handler.
 
void OnTick_Trees ()
 
void OnTick_Station ()
 
void OnTick_Industry ()
 
void OnTick_Companies ()
 Called every tick for updating some company info.
 
void OnTick_LinkGraph ()
 Spawn or join a link graph job or compress a link graph if any link graph is due to do so.
 
void CallLandscapeTick ()
 

Variables

const TileTypeProcs _tile_type_clear_procs
 
const TileTypeProcs _tile_type_rail_procs
 
const TileTypeProcs _tile_type_road_procs
 Tile callback functions for road tiles.
 
const TileTypeProcs _tile_type_town_procs
 Tile callback functions for a town.
 
const TileTypeProcs _tile_type_trees_procs
 
const TileTypeProcs _tile_type_station_procs
 
const TileTypeProcs _tile_type_water_procs
 
const TileTypeProcs _tile_type_void_procs
 
const TileTypeProcs _tile_type_industry_procs
 
const TileTypeProcs _tile_type_tunnelbridge_procs
 
const TileTypeProcs _tile_type_object_procs
 
const TileTypeProcs *const _tile_type_procs [16]
 Tile callback functions for each type of tile. More...
 
const uint8_t _slope_to_sprite_offset [32]
 landscape slope => sprite More...
 
static const uint TILE_UPDATE_FREQUENCY_LOG = 8
 The logarithm of how many ticks it takes between tile updates (log base 2).
 
static const uint TILE_UPDATE_FREQUENCY = 1 << TILE_UPDATE_FREQUENCY_LOG
 How many ticks it takes between tile updates (has to be a power of 2).
 
static SnowLine_snow_line = nullptr
 Description of the snow line throughout the year. More...
 
TileIndex _cur_tileloop_tile
 
static const uint8_t _genterrain_tbl_1 [5] = { 10, 22, 33, 37, 4 }
 
static const uint8_t _genterrain_tbl_2 [5] = { 0, 0, 0, 0, 33 }
 

Detailed Description

Functions related to the landscape (slopes etc.).

Definition in file landscape.cpp.

Function Documentation

◆ ApplyFoundationToSlope()

uint ApplyFoundationToSlope ( Foundation  f,
Slope s 
)

◆ BuildRiver()

static void BuildRiver ( TileIndex  begin,
TileIndex  end,
TileIndex  spring,
bool  main_river 
)
static

Actually build the river between the begin and end tiles using AyStar.

Parameters
beginThe begin of the river.
endThe end of the river.
springThe springing point of the river.
main_riverWhether the current river is a big river that others flow into.

Definition at line 1293 of file landscape.cpp.

◆ CalculateCoverageLine()

static uint CalculateCoverageLine ( uint  coverage,
uint  edge_multiplier 
)
static

Calculate what height would be needed to cover N% of the landmass.

The function allows both snow and desert/tropic line to be calculated. It tries to find the closests height which covers N% of the landmass; it can be below or above it.

Tropic has a mechanism where water and tropic tiles in mountains grow inside the desert. To better approximate the requested coverage, this is taken into account via an edge histogram, which tells how many neighbouring tiles are lower than the tiles of that height. The multiplier indicates how severe this has to be taken into account.

Parameters
coverageA value between 0 and 100 indicating a percentage of landmass that should be covered.
edge_multiplierHow much effect neighbouring tiles that are of a lower height level have on the score.
Returns
The estimated best height to use to cover N% of the landmass.

Definition at line 1457 of file landscape.cpp.

References abs(), AddTileIndexDiffCWrap(), DIAGDIR_NE, DIAGDIR_NW, DIAGDIR_SE, DIAGDIR_SW, IsValidTile(), MAX_TILE_HEIGHT, Map::Size(), TileHeight(), and TileIndexDiffCByDiagDir().

Referenced by CalculateDesertLine(), and CalculateSnowLine().

◆ CalculateDesertLine()

static uint8_t CalculateDesertLine ( )
static

Calculate the line (in height) between desert and tropic.

Returns
The height of the line between desert and tropic.

Definition at line 1543 of file landscape.cpp.

References _settings_game, CalculateCoverageLine(), GameCreationSettings::desert_coverage, and GameSettings::game_creation.

◆ ChangeTileOwner()

void ChangeTileOwner ( TileIndex  tile,
Owner  old_owner,
Owner  new_owner 
)

Change the owner of a tile.

Parameters
tileTile to change
old_ownerCurrent owner of the tile
new_ownerNew owner of the tile

Definition at line 564 of file landscape.cpp.

References _tile_type_procs, and GetTileType().

◆ CmdClearArea()

std::tuple<CommandCost, Money> CmdClearArea ( DoCommandFlag  flags,
TileIndex  tile,
TileIndex  start_tile,
bool  diagonal 
)

Clear a big piece of landscape.

Parameters
flagsof operation to conduct
tileend tile of area dragging
start_tilestart tile of area dragging
diagonalWhether to use the Orthogonal (false) or Diagonal (true) iterator.
Returns
the cost of this operation or an error

Definition at line 709 of file landscape.cpp.

References _current_company, _pause_mode, CommandCost::AddCost(), CompanyProperties::clear_limit, CMD_ERROR, TileIterator::Create(), CreateEffectVehicleAbove(), DC_AUTO, DC_BANKRUPT, DC_EXEC, DC_FORCE_CLEAR_TILE, EV_EXPLOSION_LARGE, EV_EXPLOSION_SMALL, EXPENSES_CONSTRUCTION, CommandCost::Failed(), GB(), GetAvailableMoneyForCommand(), CommandCost::GetCost(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::GetIfValid(), INVALID_TILE, PM_UNPAUSED, Map::Size(), TILE_SIZE, TileX(), and TileY().

◆ CmdLandscapeClear()

CommandCost CmdLandscapeClear ( DoCommandFlag  flags,
TileIndex  tile 
)

Clear a piece of landscape.

Parameters
flagsof operation to conduct
tiletile to clear
Returns
the cost of this operation or an error

Definition at line 652 of file landscape.cpp.

References CommandCost::AddCost(), DC_AUTO, DC_FORCE_CLEAR_TILE, EXPENSES_CONSTRUCTION, GetWaterClass(), HasTileWaterClass(), IsCoastTile(), IsTileOnWater(), IsWaterTile(), return_cmd_error, and WATER_CLASS_CANAL.

◆ DrawFoundation()

void DrawFoundation ( TileInfo ti,
Foundation  f 
)

Draw foundation f at tile ti.

Updates ti.

Parameters
tiTile to draw foundation on
fFoundation to draw

Definition at line 425 of file landscape.cpp.

References FOUNDATION_STEEP_BOTH, GetFoundationPixelSlope(), IsFoundation(), and TileInfo::tile.

Referenced by DrawTile_Road().

◆ FindSpring()

static bool FindSpring ( TileIndex  tile,
void *   
)
static

Find the spring of a river.

Parameters
tileThe tile to consider for being the spring.
Returns
True iff it is suitable as a spring.

Definition at line 991 of file landscape.cpp.

References _settings_game, GameSettings::game_creation, IsTileFlat(), IsWaterTile(), and GameCreationSettings::landscape.

Referenced by CreateRivers().

◆ FlowRiver()

static std::tuple<bool, bool> FlowRiver ( TileIndex  spring,
TileIndex  begin,
uint  min_river_length 
)
static

Try to flow the river down from a given begin.

Parameters
springThe springing point of the river.
beginThe begin point we are looking from; somewhere down hill from the spring.
min_river_lengthThe minimum length for the river.
Returns
First element: True iff a river could/has been built, otherwise false; second element: River ends at sea.

Definition at line 1320 of file landscape.cpp.

References DistanceManhattan(), GetTileZ(), IsWaterTile(), and TileHeight().

Referenced by CreateRivers().

◆ FlowsDown()

static bool FlowsDown ( TileIndex  begin,
TileIndex  end 
)
static

Check whether a river at begin could (logically) flow down to end.

Parameters
beginThe origin of the flow.
endThe destination of the flow.
Returns
True iff the water can be flowing down.

Definition at line 1197 of file landscape.cpp.

References DistanceManhattan(), GetTileSlopeZ(), IsInclinedSlope(), and SLOPE_FLAT.

◆ GenerateLandscape()

bool GenerateLandscape ( uint8_t  mode)

Number of steps of landscape generation

< Loading a heightmap

< Terragenesis generator

< Original generator

< Extra steps needed for tropic landscape

< Extra steps for other landscapes

Definition at line 1549 of file landscape.cpp.

References _settings_game, GameSettings::game_creation, and GameCreationSettings::landscape.

◆ GetFoundationSlope()

std::tuple<Slope, int> GetFoundationSlope ( TileIndex  tile)

Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation, the function returns the same as GetTileSlope.

Parameters
tileThe tile of interest.
Returns
The slope on top of the foundation and the z of the foundation slope.

Definition at line 382 of file landscape.cpp.

References _tile_type_procs, ApplyFoundationToSlope(), GetTileSlopeZ(), and GetTileType().

Referenced by GetFoundationPixelSlope(), IsPossibleCrossing(), IsRoadAllowedHere(), and TileLoop_Water().

◆ GetPartialPixelZ()

uint GetPartialPixelZ ( int  x,
int  y,
Slope  corners 
)

Determines height at given coordinate of a slope.

At the northern corner (0, 0) the result is always a multiple of TILE_HEIGHT. When the height is a fractional Z, then the height is rounded down. For example, when at the height is 0 at x = 0 and the height is 8 at x = 16 (actually x = 0 of the next tile), then height is 0 at x = 1, 1 at x = 2, and 7 at x = 15.

Parameters
xx coordinate (value from 0 to 15)
yy coordinate (value from 0 to 15)
cornersslope to examine
Returns
height of given point of given slope

Definition at line 228 of file landscape.cpp.

Referenced by CheckPartialPixelZ().

◆ GetSlopePixelZ()

int GetSlopePixelZ ( int  x,
int  y,
bool  ground_vehicle 
)

Return world Z coordinate of a given point of a tile.

Normally this is the Z of the ground/foundation at the given location, but in some cases the ground/foundation can differ from the Z coordinate that the (ground) vehicle passing over it would take. For example when entering a tunnel or bridge.

Parameters
xWorld X coordinate in tile "units".
yWorld Y coordinate in tile "units".
ground_vehicleWhether to get the Z coordinate of the ground vehicle, or the ground.
Returns
World Z coordinate at tile ground (vehicle) level, including slopes and foundations.

Definition at line 303 of file landscape.cpp.

Referenced by CheckGroundVehiclesAtCorrectZ(), GetPCPElevation(), HandleCrashedAircraft(), GroundVehicle< RoadVehicle, VEH_ROAD >::UpdateZPosition(), and GroundVehicle< RoadVehicle, VEH_ROAD >::UpdateZPositionAndInclination().

◆ GetSlopePixelZOnEdge()

void GetSlopePixelZOnEdge ( Slope  tileh,
DiagDirection  edge,
int &  z1,
int &  z2 
)

Determine the Z height of the corners of a specific tile edge.

Note
If a tile has a non-continuous halftile foundation, a corner can have different heights wrt. its edges.
Precondition
z1 and z2 must be initialized (typ. with TileZ). The corner heights just get added.
Parameters
tilehThe slope of the tile.
edgeThe edge of interest.
z1Gets incremented by the height of the first corner of the edge. (near corner wrt. the camera)
z2Gets incremented by the height of the second corner of the edge. (far corner wrt. the camera)

Definition at line 354 of file landscape.cpp.

References GetHalftileSlopeCorner(), IsHalftileSlope(), RemoveHalftileSlope(), SLOPE_E, SLOPE_N, SLOPE_S, SLOPE_STEEP_E, SLOPE_STEEP_N, SLOPE_STEEP_S, SLOPE_STEEP_W, SLOPE_W, SlopeWithOneCornerRaised(), and TILE_HEIGHT.

◆ GetSlopePixelZOutsideMap()

int GetSlopePixelZOutsideMap ( int  x,
int  y 
)

Return world z coordinate of a given point of a tile, also for tiles outside the map (virtual "black" tiles).

Parameters
xWorld X coordinate in tile "units", may be outside the map.
yWorld Y coordinate in tile "units", may be outside the map.
Returns
World Z coordinate at tile ground level, including slopes and foundations.

Definition at line 318 of file landscape.cpp.

◆ GetSlopeZInCorner()

int GetSlopeZInCorner ( Slope  tileh,
Corner  corner 
)

Determine the Z height of a corner relative to TileZ.

Precondition
The slope must not be a halftile slope.
Parameters
tilehThe slope.
cornerThe corner.
Returns
Z position of corner relative to TileZ.

Definition at line 336 of file landscape.cpp.

References IsHalftileSlope(), SlopeWithOneCornerRaised(), and SteepSlope().

Referenced by GetSlopePixelZInCorner().

◆ GetTileTrackStatus()

TrackStatus GetTileTrackStatus ( TileIndex  tile,
TransportType  mode,
uint  sub_mode,
DiagDirection  side 
)

Returns information about trackdirs and signal states.

If there is any trackbit at 'side', return all trackdirbits. For TRANSPORT_ROAD, return no trackbits if there is no roadbit (of given subtype) at given side.

Parameters
tiletile to get info about
modetransport type
sub_modefor TRANSPORT_ROAD, roadtypes to check
sideside we are entering from, INVALID_DIAGDIR to return all trackbits
Returns
trackdirbits and other info depending on 'mode'

Definition at line 553 of file landscape.cpp.

References _tile_type_procs, TileTypeProcs::get_tile_track_status_proc, and GetTileType().

Referenced by CheckRoadBlockedForOvertaking(), CYapfFollowShipT< Types >::CheckShipReverse(), DisasterTick_Submarine(), FixOwnerOfRailTrack(), GenericPlaceSignals(), GetTrackdirBitsForRoad(), MaskWireBits(), RoadFindPathToDest(), RoadVehicle::TileMayHaveSlopedTrack(), TrainController(), TryPathReserve(), TryReserveRailTrack(), UnreserveRailTrack(), and UpdateSignalsInBuffer().

◆ InverseRemapCoords2()

Point InverseRemapCoords2 ( int  x,
int  y,
bool  clamp_to_map,
bool *  clamped 
)

Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.

Function takes into account height of tiles and foundations.

Parameters
xX viewport 2D coordinate.
yY viewport 2D coordinate.
clamp_to_mapClamp the coordinate outside of the map to the closest, non-void tile within the map.
[out]clampedWhether coordinates were clamped.
Returns
3D world coordinate of point visible at the given screen coordinate (3D perspective).
Note
Inverse of RemapCoords2 function. Smaller values may get rounded.
See also
InverseRemapCoords

Definition at line 111 of file landscape.cpp.

Referenced by ClampViewportToMap(), SmallMapWindow::DrawMapIndicators(), and SmallMapWindow::SmallMapCenterOnCurrentPos().

◆ MakeLake()

static bool MakeLake ( TileIndex  tile,
void *  user_data 
)
static

Make a connected lake; fill all tiles in the circular tile search that are connected.

Parameters
tileThe tile to consider for lake making.
user_dataThe height of the lake.
Returns
Always false, so it continues searching.

Definition at line 1027 of file landscape.cpp.

References _settings_game, GameSettings::game_creation, IsTileFlat(), IsValidTile(), GameCreationSettings::landscape, and TileHeight().

◆ RiverMakeWider()

static bool RiverMakeWider ( TileIndex  tile,
void *  data 
)
static

Widen a river by expanding into adjacent tiles via circular tile search.

Parameters
tileThe tile to try expanding the river into.
dataThe tile to try surrounding the river around.
Returns
Always false, so it continues searching.

Definition at line 1050 of file landscape.cpp.

References ChangeDiagDir(), ComplementSlope(), DC_AUTO, DC_EXEC, DIAGDIR_BEGIN, DIAGDIR_END, DIAGDIRDIFF_90LEFT, DIAGDIRDIFF_90RIGHT, DIAGDIRDIFF_BEGIN, DIAGDIRDIFF_END, DIAGDIRDIFF_REVERSE, DIAGDIRDIFF_SAME, GetInclinedSlopeDirection(), GetTileMaxZ(), GetTileSlope(), GetTileZ(), IsInclinedSlope(), IsRiver(), IsSlopeWithOneCornerRaised(), IsSlopeWithThreeCornersRaised(), IsSteepSlope(), IsTileFlat(), IsValidTile(), IsWaterTile(), MakeRiverAndModifyDesertZoneAround(), ReverseDiagDir(), SLOPE_FLAT, and TileAddByDiagDir().

Variable Documentation

◆ _slope_to_sprite_offset

const uint8_t _slope_to_sprite_offset[32]
Initial value:
= {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0,
}

landscape slope => sprite

Referenced by SlopeToSpriteOffset().

◆ _tile_type_procs

const TileTypeProcs* const _tile_type_procs[16]
Initial value:
= {
&_tile_type_clear_procs,
&_tile_type_rail_procs,
&_tile_type_trees_procs,
&_tile_type_station_procs,
&_tile_type_water_procs,
&_tile_type_void_procs,
&_tile_type_industry_procs,
&_tile_type_tunnelbridge_procs,
&_tile_type_object_procs,
}

Tile callback functions for each type of tile.

See also
TileType

Definition at line 65 of file landscape.cpp.

Referenced by ChangeTileOwner(), GetFoundationSlope(), and GetTileTrackStatus().

_tile_type_town_procs
const TileTypeProcs _tile_type_town_procs
Tile callback functions for a town.
Definition: landscape.cpp:51
_tile_type_road_procs
const TileTypeProcs _tile_type_road_procs
Tile callback functions for road tiles.
Definition: landscape.cpp:50