Go to the documentation of this file.
41 #include "table/strings.h"
47 _tile_type_clear_procs,
48 _tile_type_rail_procs,
51 _tile_type_trees_procs,
52 _tile_type_station_procs,
53 _tile_type_water_procs,
54 _tile_type_void_procs,
55 _tile_type_industry_procs,
56 _tile_type_tunnelbridge_procs,
57 _tile_type_object_procs;
65 &_tile_type_clear_procs,
66 &_tile_type_rail_procs,
69 &_tile_type_trees_procs,
70 &_tile_type_station_procs,
71 &_tile_type_water_procs,
72 &_tile_type_void_procs,
73 &_tile_type_industry_procs,
74 &_tile_type_tunnelbridge_procs,
75 &_tile_type_object_procs,
80 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
81 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0,
109 if (clamped !=
nullptr) *clamped =
false;
127 if (clamped !=
nullptr) *clamped = (pt.x != old_pt.x) || (pt.y != old_pt.y);
137 for (
int i = 0; i < 5; i++) z = GetSlopePixelZ(
Clamp(pt.x + std::max(z, 4) - 4, min_coord, max_x),
Clamp(pt.y + std::max(z, 4) - 4, min_coord, max_y)) / 2;
138 for (
int m = 3; m > 0; m--) z = GetSlopePixelZ(
Clamp(pt.x + std::max(z, m) - m, min_coord, max_x),
Clamp(pt.y + std::max(z, m) - m, min_coord, max_y)) / 2;
139 for (
int i = 0; i < 5; i++) z = GetSlopePixelZ(
Clamp(pt.x + z, min_coord, max_x),
Clamp(pt.y + z, min_coord, max_y)) / 2;
150 pt.x =
Clamp(pt.x, min_coord, max_x);
151 pt.y =
Clamp(pt.y, min_coord, max_y);
152 if (clamped !=
nullptr) *clamped = *clamped || (pt.x != old_pt.x) || (pt.y != old_pt.y);
191 *s = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ?
SLOPE_SW :
SLOPE_NE);
195 *s = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ?
SLOPE_SE :
SLOPE_NW);
206 default: NOT_REACHED();
239 default: NOT_REACHED();
325 z = 1 + ((x + y) >> 1);
329 z = 1 + ((x + (y ^ 0xF)) >> 1);
333 z = 1 + (((x ^ 0xF) + (y ^ 0xF)) >> 1);
337 z = 1 + (((x ^ 0xF) + y) >> 1);
346 int GetSlopePixelZ(
int x,
int y)
364 return GetSlopePixelZ(x, y);
399 static const Slope corners[4][4] = {
409 if (halftile_test == corners[edge][0]) *z2 +=
TILE_HEIGHT;
410 if (halftile_test == corners[edge][1]) *z1 +=
TILE_HEIGHT;
412 if ((tileh & corners[edge][0]) != 0) *z1 +=
TILE_HEIGHT;
413 if ((tileh & corners[edge][1]) != 0) *z2 +=
TILE_HEIGHT;
431 if (z !=
nullptr) *z += z_inc;
436 bool HasFoundationNW(
TileIndex tile,
Slope slope_here, uint z_here)
440 int z_W_here = z_here;
441 int z_N_here = z_here;
449 return (z_N_here > z_N) || (z_W_here > z_W);
453 bool HasFoundationNE(
TileIndex tile,
Slope slope_here, uint z_here)
457 int z_E_here = z_here;
458 int z_N_here = z_here;
466 return (z_N_here > z_N) || (z_E_here > z_E);
481 uint sprite_block = 0;
491 if (!HasFoundationNW(ti->
tile, slope, z)) sprite_block += 1;
492 if (!HasFoundationNE(ti->
tile, slope, z)) sprite_block += 2;
495 SpriteID leveled_base = (sprite_block == 0 ? (int)SPR_FOUNDATION_BASE : (SPR_SLOPES_VIRTUAL_BASE + sprite_block * SPR_TRKFOUND_BLOCK_SIZE));
496 SpriteID inclined_base = SPR_SLOPES_VIRTUAL_BASE + SPR_SLOPES_INCLINED_OFFSET + sprite_block * SPR_TRKFOUND_BLOCK_SIZE;
528 int x_bb = (((highest_corner == CORNER_W) || (highest_corner == CORNER_S)) ?
TILE_SIZE / 2 : 0);
529 int y_bb = (((highest_corner == CORNER_S) || (highest_corner == CORNER_E)) ?
TILE_SIZE / 2 : 0);
534 Point pt = {(y_bb - x_bb) * 2, y_bb + x_bb};
545 int x_bb = (((halftile_corner == CORNER_W) || (halftile_corner == CORNER_S)) ?
TILE_SIZE / 2 : 0);
546 int y_bb = (((halftile_corner == CORNER_S) || (halftile_corner == CORNER_E)) ?
TILE_SIZE / 2 : 0);
551 Point pt = {(y_bb - x_bb) * 2, y_bb + x_bb};
588 if (remove) RemoveDockingTile(tile);
704 bool do_clear =
false;
721 if (coa !=
nullptr && coa->
first_tile != tile) {
736 if (do_clear) DoClearSquare(tile);
756 bool had_success =
false;
759 int limit = (c ==
nullptr ? INT32_MAX :
GB(c->
clear_limit, 16, 16));
776 if (ret.
GetCost() > 0 && money < 0) {
778 return { cost, ret.
GetCost() };
792 if (ret.
GetCost() != 0 && --limit <= 0)
break;
798 return { had_success ? cost : last_error, 0 };
817 static const uint32 feedbacks[] = {
818 0xD8F, 0x1296, 0x2496, 0x4357, 0x8679, 0x1030E, 0x206CD, 0x403FE, 0x807B8, 0x1004B2, 0x2006A8, 0x4004B2, 0x800B87
840 tile = (tile >> 1) ^ (-(int32)(tile & 1) & feedback);
843 _cur_tileloop_tile = tile;
846 void InitializeLandscape()
861 static const byte _genterrain_tbl_1[5] = { 10, 22, 33, 37, 4 };
862 static const byte _genterrain_tbl_2[5] = { 0, 0, 0, 0, 33 };
864 static void GenerateTerrain(
int type, uint flag)
868 const Sprite *templ = GetSprite((((r >> 24) * _genterrain_tbl_1[type]) >> 8) + _genterrain_tbl_2[type] + 4845,
ST_MAPGEN);
869 if (templ ==
nullptr)
usererror(
"Map generator sprites could not be loaded");
875 if (x <= edge_distance || y <= edge_distance)
return;
878 uint w = templ->
width;
883 const byte *p = templ->
data;
885 if ((flag & 4) != 0) {
891 default: NOT_REACHED();
893 if (xw + yw >
MapSize() - bias)
return;
897 if (yw < xw + bias)
return;
901 if (xw + yw <
MapSize() + bias)
return;
905 if (xw < yw + bias)
return;
910 if (x + w >=
MapMaxX())
return;
911 if (y + h >=
MapMaxY())
return;
916 default: NOT_REACHED();
921 for (uint w_cur = w; w_cur != 0; --w_cur) {
934 for (uint h_cur = h; h_cur != 0; --h_cur) {
948 for (uint w_cur = w; w_cur != 0; --w_cur) {
962 for (uint h_cur = h; h_cur != 0; --h_cur) {
976 static void CreateDesertOrRainForest(uint desert_tropic_line)
986 for (data = _make_desert_or_rainforest_data;
987 data !=
endof(_make_desert_or_rainforest_data); ++data) {
991 if (data ==
endof(_make_desert_or_rainforest_data)) {
996 for (uint i = 0; i != 256; i++) {
1007 for (data = _make_desert_or_rainforest_data;
1008 data !=
endof(_make_desert_or_rainforest_data); ++data) {
1012 if (data ==
endof(_make_desert_or_rainforest_data)) {
1026 int referenceHeight;
1034 for (
int dx = -1; dx <= 1; dx++) {
1035 for (
int dy = -1; dy <= 1; dy++) {
1041 if (num < 4)
return false;
1044 for (
int dx = -16; dx <= 16; dx++) {
1045 for (
int dy = -16; dy <= 16; dy++) {
1062 uint height = *(uint*)user_data;
1110 bool flat_river_found =
false;
1111 bool sloped_river_found =
false;
1130 desired_slope = other_slope;
1131 sloped_river_found =
true;
1136 if (
IsTileFlat(other_tile)) flat_river_found =
true;
1140 if (!sloped_river_found && !flat_river_found)
return false;
1143 if (!sloped_river_found && flat_river_found) desired_slope =
SLOPE_FLAT;
1170 Slope to_change = cur_slope ^ desired_slope;
1181 to_change = cur_slope ^ desired_slope;
1203 if (!
IsWaterTile(downstream_tile) && !downstream_is_ocean) {
1230 if (cur_slope == desired_slope) {
1258 return heightEnd <= heightBegin &&
1262 ((slopeEnd == slopeBegin && heightEnd < heightBegin) || slopeEnd ==
SLOPE_FLAT || slopeBegin ==
SLOPE_FLAT);
1292 TileIndex tile = current->path.node.tile;
1294 aystar->num_neighbours = 0;
1298 aystar->neighbours[aystar->num_neighbours].tile = t2;
1300 aystar->num_neighbours++;
1312 for (
PathNode *path = ¤t->path; path !=
nullptr; path = path->
parent, cur_pos++) {
1327 uint current_river_length;
1331 for (
PathNode *path = ¤t->path; path !=
nullptr; path = path->
parent, cur_pos++) {
1336 radius = std::min(3u, (current_river_length / (long_river_length / 3u)) + 1u);
1368 finder.CalculateG = River_CalculateG;
1369 finder.CalculateH = River_CalculateH;
1370 finder.GetNeighbours = River_GetNeighbours;
1371 finder.EndNodeCheck = River_EndNodeCheck;
1372 finder.FoundEndNode = River_FoundEndNode;
1373 finder.user_target = &end;
1374 finder.user_data = &user_data;
1395 # define SET_MARK(x) marks.insert(x)
1396 # define IS_MARKED(x) (marks.find(x) != marks.end())
1404 std::set<TileIndex> marks;
1408 std::list<TileIndex> queue;
1409 queue.push_back(begin);
1415 end = queue.front();
1429 queue.push_back(t2);
1432 }
while (!queue.empty());
1434 bool main_river =
false;
1437 std::tie(found, main_river) =
FlowRiver(spring, end, min_river_length);
1438 }
else if (count > 32) {
1442 std::set<TileIndex>::const_iterator cit = marks.begin();
1452 lakeCenter != begin &&
1473 if (found)
BuildRiver(begin, end, spring, main_river);
1474 return { found, main_river };
1483 if (amount == 0)
return;
1486 const uint num_short_rivers = wells - std::max(1u, wells / 10);
1490 for (; wells > num_short_rivers; wells--) {
1492 for (
int tries = 0; tries < 512; tries++) {
1500 for (; wells != 0; wells--) {
1502 for (
int tries = 0; tries < 128; tries++) {
1510 ConvertGroundTilesIntoWaterTiles();
1513 for (uint i = 0; i != 256; i++) {
1546 std::array<int, MAX_TILE_HEIGHT + 1> histogram = {};
1548 std::array<int, MAX_TILE_HEIGHT + 1> edge_histogram = {};
1555 if (edge_multiplier != 0) {
1557 for (
auto dir : neighbour_dir) {
1560 edge_histogram[h]++;
1568 int best_score = land_tiles;
1571 int goal_tiles = land_tiles * coverage / 100;
1577 int current_tiles = 0;
1578 for (; h > 0; h--) {
1579 current_tiles += histogram[h];
1580 int current_score = goal_tiles - current_tiles;
1589 if (edge_multiplier != 0 && h > 1) {
1591 current_score -= edge_histogram[1] * edge_multiplier;
1593 current_score -= edge_histogram[h] * edge_multiplier;
1597 best_score = current_score;
1631 enum GenLandscapeSteps {
1633 GLS_TERRAGENESIS = 5,
1655 uint32 r = Random();
1658 GenerateTerrain(2, 0);
1661 uint flag =
GB(r, 7, 2) | 4;
1663 GenerateTerrain(4, flag);
1669 uint32 r = Random();
1672 GenerateTerrain(0, 0);
1675 uint flag =
GB(r, 7, 2) | 4;
1677 GenerateTerrain(0, flag);
1683 GenerateTerrain(3, flag);
1689 uint32 r = Random();
1693 for (; i != 0; --i) {
1708 ConvertGroundTilesIntoWaterTiles();
1719 CreateDesertOrRainForest(desert_tropic_line);
1731 void OnTick_Trees();
1732 void OnTick_Station();
1733 void OnTick_Industry();
1738 void CallLandscapeTick()
static uint8 CalculateDesertLine()
Calculate the line (in height) between desert and tropic.
static uint MapLogX()
Logarithm of the map size along the X side.
byte min_river_length
the minimum river length
static Corner OppositeCorner(Corner corner)
Returns the opposite corner.
void GenerateTerrainPerlin()
The main new land generator using Perlin noise.
@ MP_CLEAR
A tile without any structures, i.e. grass, rocks, farm fields etc.
bool IsTileFlat(TileIndex tile, int *h)
Check if a given tile is flat.
@ SLOPE_SE
south and east corner are raised
@ TROPICZONE_DESERT
Tile is desert.
static TileIndex AddTileIndexDiffCWrap(TileIndex tile, TileIndexDiffC diff)
Add a TileIndexDiffC to a TileIndex and returns the new one.
@ SLOPE_STEEP_E
a steep slope falling to west (from east)
void GenerateLandscape(byte mode)
Iterator to iterate over a diagonal area of the map.
@ AYSTAR_DONE
Not an end-tile, or wrong direction.
static TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
static void CalculateSnowLine()
Calculate the line from which snow begins.
void FixSlopes()
This function takes care of the fact that land in OpenTTD can never differ more than 1 in height.
static const uint SNOW_LINE_DAYS
Number of days in each month in the snow line table.
int GetTileMaxZ(TileIndex t)
Get top height of the tile inside the map.
void CDECL usererror(const char *s,...)
Error handling for fatal user errors.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
static void BuildRiver(TileIndex begin, TileIndex end, TileIndex spring, bool main_river)
Actually build the river between the begin and end tiles using AyStar.
void LoadHeightmap(DetailedFileType dft, const char *filename)
Load a heightmap from file and change the map in its current dimensions to a landscape representing t...
static bool HasTileWaterClass(TileIndex t)
Checks whether the tile has an waterclass associated.
@ SLOPE_STEEP_S
a steep slope falling to north (from south)
const TileTypeProcs *const _tile_type_procs[16]
Tile callback functions for each type of tile.
uint x
X position of the tile in unit coordinates.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
Tile information, used while rendering the tile.
byte landscape
the landscape we're currently in
static Slope GetFoundationPixelSlope(TileIndex tile, int *z)
Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation,...
static void CreateRivers()
Actually (try to) create some rivers.
@ SLOPE_NW
north and west corner are raised
DiagDirDiff
Enumeration for the difference between to DiagDirection.
byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS]
Height of the snow line each day of the year.
static const uint MIN_MAP_SIZE_BITS
Minimal and maximal map width and height.
static Axis DiagDirToAxis(DiagDirection d)
Convert a DiagDirection to the axis.
std::string name
Name of the file.
uint8 map_height_limit
the maximum allowed heightlevel
int GetSlopeZInCorner(Slope tileh, Corner corner)
Determine the Z height of a corner relative to TileZ.
@ DIAGDIR_END
Used for iterations.
static void MakeClear(TileIndex t, ClearGround g, uint density)
Make a clear tile.
static bool IsFoundation(Foundation f)
Tests for FOUNDATION_NONE.
@ TROPICZONE_RAINFOREST
Rainforest tile.
@ LG_ORIGINAL
The original landscape generator.
@ SLOPE_ELEVATED
bit mask containing all 'simple' slopes
DifficultySettings difficulty
settings related to the difficulty
static bool IsHalftileSlope(Slope s)
Checks for non-continuous slope on halftile foundations.
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
static constexpr TileIndex INVALID_TILE
The very nice invalid tile marker.
static bool IsClearGround(TileIndex t, ClearGround ct)
Set the type of clear tile.
uint16 height
Height of the sprite.
@ DIAGDIRDIFF_90LEFT
90 degrees left
static Slope RemoveHalftileSlope(Slope s)
Removes a halftile slope from a slope.
static bool IsCoastTile(TileIndex t)
Is it a coast tile.
static const SpriteID SPR_HALFTILE_FOUNDATION_BASE
Halftile foundations.
uint GetPartialPixelZ(int x, int y, Slope corners)
Determines height at given coordinate of a slope.
static const uint TILE_SIZE
Tile size in world coordinates.
GetTileTrackStatusProc * get_tile_track_status_proc
Get available tracks and status of a tile.
uint y
Y position of the tile in unit coordinates.
@ DC_NO_WATER
don't allow building on water
@ SLOPE_ENW
east, north and west corner are raised
static uint TileY(TileIndex tile)
Get the Y component of a tile.
@ SLOPE_S
the south corner of the tile is raised
static uint32 RandomRange(uint32 limit)
Pick a random number between 0 and limit - 1, inclusive.
@ DIAGDIRDIFF_SAME
Same directions.
@ EV_EXPLOSION_SMALL
Various explosions.
static const uint MAX_TILE_HEIGHT
Maximum allowed tile height.
int Main()
This is the function you call to run AyStar.
Owner
Enum for all companies/owners.
@ EV_EXPLOSION_LARGE
Various explosions.
@ DC_EXEC
execute the given command
Tile description for the 'land area information' tool.
static Corner GetHighestSlopeCorner(Slope s)
Returns the highest corner of a slope (one corner raised or a steep slope).
@ SLOPE_E
the east corner of the tile is raised
DoCommandFlag
List of flags for a command.
Foundation
Enumeration for Foundations.
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
@ PFE_GL_LANDSCAPE
Time spent processing other world features.
static uint TileX(TileIndex tile)
Get the X component of a tile.
GameCreationSettings game_creation
settings used during the creation of a game (map)
TrackStatus GetTileTrackStatus(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
Returns information about trackdirs and signal states.
@ PM_UNPAUSED
A normal unpaused game.
Slope tileh
Slope of the tile.
uint32 SpriteID
The number of a sprite, without mapping bits and colourtables.
uint32 clear_limit
Amount of tiles we can (still) clear (times 65536).
static uint MapSizeX()
Get the size of the map along the X.
static bool IsTileOnWater(TileIndex t)
Tests if the tile was built on water.
@ GWP_LANDSCAPE
Create the landscape.
void Init(Hash_HashProc hash, uint num_buckets)
Initialize an AyStar.
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner)
Change the owner of a tile.
void OnTick_Companies()
Called every tick for updating some company info.
Slope
Enumeration for the slope-type.
Iterator to iterate over a tile area (rectangle) of the map.
uint DistanceManhattan(TileIndex t0, TileIndex t1)
Gets the Manhattan distance between the two given tiles.
static bool FindSpring(TileIndex tile, void *user_data)
Find the spring of a river.
@ FOUNDATION_INCLINED_Y
The tile has an along Y-axis inclined foundation.
static Slope SteepSlope(Corner corner)
Returns a specific steep slope.
#define return_cmd_error(errcode)
Returns from a function with a specific StringID as error.
static uint MapSize()
Get the size of the map.
@ EXPENSES_CONSTRUCTION
Construction costs.
const TileTypeProcs _tile_type_town_procs
Tile callback functions for a town.
TileIndex TileAddWrap(TileIndex tile, int addx, int addy)
This function checks if we add addx/addy to tile, if we do wrap around the edges.
static bool IsSteepSlope(Slope s)
Checks if a slope is steep.
Common return value for all commands.
byte GetSnowLine()
Get the current snow line, either variable or static.
static Point InverseRemapCoords(int x, int y)
Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
@ GWM_HEIGHTMAP
Generate a newgame from a heightmap.
@ DIAGDIRDIFF_BEGIN
Used for iterations.
Date _date
Current date in days (day counter)
static void SetTropicZone(TileIndex tile, TropicZone type)
Set the tropic zone.
static uint TileHeight(TileIndex tile)
Returns the height of a tile.
bool CircularTileSearch(TileIndex *tile, uint size, TestTileOnSearchProc proc, void *user_data)
Function performing a search around a center tile and going outward, thus in circle.
void Free()
This function frees the memory it allocated.
@ FOUNDATION_STEEP_BOTH
The tile has a steep slope. The lowest corner is raised by a foundation and the upper halftile is lev...
@ SLOPE_WSE
west, south and east corner are raised
static DiagDirection ChangeDiagDir(DiagDirection d, DiagDirDiff delta)
Applies a difference on a DiagDirection.
@ SLOPE_NE
north and east corner are raised
byte terrain_type
the mountainousness of the landscape
static bool IsSlopeWithThreeCornersRaised(Slope s)
Tests if a specific slope has exactly three corners raised.
static bool IsInclinedFoundation(Foundation f)
Tests if the foundation is an inclined foundation.
Base class for tile iterators.
TransportType
Available types of transport.
TileIndex first_tile
The first tile being cleared, which then causes the whole object to be cleared.
static bool IsInsideBS(const T x, const size_t base, const size_t size)
Checks if a value is between a window started at some base point.
static uint CalculateCoverageLine(uint coverage, uint edge_multiplier)
Calculate what height would be needed to cover N% of the landmass.
const byte _slope_to_sprite_offset[32]
landscape slope => sprite
@ FOUNDATION_INCLINED_X
The tile has an along X-axis inclined foundation.
bool Failed() const
Did this command fail?
Corner
Enumeration of tile corners.
@ WATER_CLASS_CANAL
Canal.
static void MakeVoid(TileIndex t)
Make a nice void tile ;)
PauseMode _pause_mode
The current pause mode.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
static TropicZone GetTropicZone(TileIndex tile)
Get the tropic zone.
void ConvertDateToYMD(Date date, YearMonthDay *ymd)
Converts a Date to a Year, Month & Day.
@ DIAGDIRDIFF_90RIGHT
90 degrees right
static std::tuple< bool, bool > FlowRiver(TileIndex spring, TileIndex begin, uint min_river_length)
Try to flow the river down from a given begin.
byte snow_line_height
the configured snow line height (deduced from "snow_coverage")
byte HighestSnowLine()
Get the highest possible snow line height, either variable or static.
uint16 width
Width of the sprite.
static bool IsValidTile(TileIndex tile)
Checks if a tile is valid.
bool freeform_edges
allow terraforming the tiles at the map edges
Money GetCost() const
The costs as made up to this moment.
static DiagDirection ReverseDiagDir(DiagDirection d)
Returns the reverse direction of the given DiagDirection.
static TileIndex TileAddByDiagDir(TileIndex tile, DiagDirection dir)
Adds a DiagDir to a tile.
Slope GetTileSlope(TileIndex tile, int *h)
Return the slope of a given tile inside the map.
GetTileDescProc * get_tile_desc_proc
Get a description of a tile (for the 'land area information' tool)
byte quantity_sea_lakes
the amount of seas/lakes
static bool IsNonContinuousFoundation(Foundation f)
Tests if a foundation is a non-continuous foundation, i.e.
#define RandomTile()
Get a valid random tile.
byte LowestSnowLine()
Get the lowest possible snow line height, either variable or static.
static Slope SlopeWithThreeCornersRaised(Corner corner)
Returns the slope with all except one corner raised.
static uint TileHash(uint x, uint y)
Calculate a hash value from a tile position.
static Corner GetHalftileSlopeCorner(Slope s)
Returns the leveled halftile of a halftile slope.
Money GetAvailableMoneyForCommand()
@ INVALID_TRACKDIR
Flag for an invalid trackdir.
Coordinates of a point in 2D.
static SnowLine * _snow_line
Description of the snow line throughout the year.
@ SLOPE_NS
north and south corner are raised
DiagDirection
Enumeration for diagonal directions.
static uint MapSizeY()
Get the size of the map along the Y.
Slope GetFoundationSlope(TileIndex tile, int *z)
Get slope of a tile on top of a (possible) foundation If a tile does not have a foundation,...
void OffsetGroundSprite(int x, int y)
Called when a foundation has been drawn for the current tile.
Structure describing the height of the snow line each day of the year.
void GetSlopePixelZOnEdge(Slope tileh, DiagDirection edge, int *z1, int *z2)
Determine the Z height of the corners of a specific tile edge.
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
@ SLOPE_NWS
north, west and south corner are raised
Set of callback functions for performing tile operations of a given tile type.
@ DC_BANKRUPT
company bankrupts, skip money check, skip vehicle on tile check in some cases
static void SetTileHeight(TileIndex tile, uint height)
Sets the height of a tile.
static bool IsTileType(TileIndex tile, TileType type)
Checks if a tile is a given tiletype.
Point InverseRemapCoords2(int x, int y, bool clamp_to_map, bool *clamped)
Map 2D viewport or smallmap coordinate to 3D world or tile coordinate.
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int w, int h, int dz, int z, bool transparent, int bb_offset_x, int bb_offset_y, int bb_offset_z, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
@ SLOPE_W
the west corner of the tile is raised
void SetSnowLine(byte table[SNOW_LINE_MONTHS][SNOW_LINE_DAYS])
Set a variable snow line, as loaded from a newgrf file.
@ FOUNDATION_STEEP_LOWER
The tile has a steep slope. The lowest corner is raised by a foundation to allow building railroad on...
static uint ApplyPixelFoundationToSlope(Foundation f, Slope *s)
Applies a foundation to a slope.
A pair-construct of a TileIndexDiff.
@ SLOPE_SEN
south, east and north corner are raised
void DrawFoundation(TileInfo *ti, Foundation f)
Draw foundation f at tile ti.
bool _generating_world
Whether we are generating the map or not.
@ DIAGDIRDIFF_REVERSE
Reverse directions.
byte lowest_value
Lowest snow line of the year.
CompanyID _current_company
Company currently doing an action.
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
byte highest_value
Highest snow line of the year.
@ AYSTAR_FOUND_END_NODE
An end node was found.
static WaterClass GetWaterClass(TileIndex t)
Get the water class at a tile.
TileIndex spring
The current spring during river generation.
static uint ScaleByMapSize(uint n)
Scales the given value by the map size, where the given value is for a 256 by 256 map.
static Slope SlopeWithOneCornerRaised(Corner corner)
Returns the slope with a specific corner raised.
@ DC_FORCE_CLEAR_TILE
do not only remove the object on the tile, but also clear any water left on it
static uint MapMaxY()
Gets the maximum Y coordinate within the map, including MP_VOID.
@ SLOPE_EW
east and west corner are raised
ClearedObjectArea * FindClearedObject(TileIndex tile)
Find the entry in _cleared_object_areas which occupies a certain tile.
AyStar search algorithm struct.
@ MP_VOID
Invisible tiles at the SW and SE border.
static const uint MAX_MAP_SIZE_BITS
Maximal size of map is equal to 2 ^ MAX_MAP_SIZE_BITS.
static bool FlowsDown(TileIndex begin, TileIndex end)
Check whether a river at begin could (logically) flow down to end.
void DeleteAnimatedTile(TileIndex tile)
Removes the given tile from the animated tile table.
static TileIndex TileXY(uint x, uint y)
Returns the TileIndex of a coordinate.
static void ClearBridgeMiddle(TileIndex t)
Removes bridges from the given, that is bridges along the X and Y axis.
static bool IsSpecialRailFoundation(Foundation f)
Tests if a foundation is a special rail foundation for single horizontal/vertical track.
byte desert_coverage
the amount of desert coverage on the map
static bool IsSlopeWithOneCornerRaised(Slope s)
Tests if a specific slope has exactly one corner raised.
@ SLOPE_N
the north corner of the tile is raised
@ DIAGDIRDIFF_END
Used for iterations.
byte amount_of_rivers
the amount of rivers
byte land_generator
the landscape generator
Parameters for river generation to pass as AyStar user data.
static bool IsWaterTile(TileIndex t)
Is it a water tile with plain water?
void SetGeneratingWorldProgress(GenWorldProgress cls, uint total)
Set the total of a stage of the world generation.
#define endof(x)
Get the end element of an fixed size array.
static int GetSlopeMaxPixelZ(Slope s)
Returns the height of the highest corner of a slope relative to TileZ (= minimal height)
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
@ SLOPE_SW
south and west corner are raised
PathNode * parent
The parent of this item.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
static TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
@ LG_TERRAGENESIS
TerraGenesis Perlin landscape generator.
bool IsSnowLineSet()
Has a snow line table already been loaded.
static const uint RIVER_OFFSET_DESERT_DISTANCE
Circular tile search radius to create non-desert around a river tile.
@ DIAGDIR_BEGIN
Used for iterations.
@ DC_AUTO
don't allow building on structures
static Corner GetRailFoundationCorner(Foundation f)
Returns the track corner of a special rail foundation.
EffectVehicle * CreateEffectVehicleAbove(int x, int y, int z, EffectVehicleType type)
Create an effect vehicle above a particular location.
static bool IsRiver(TileIndex t)
Is it a river water tile?
static uint MapMaxX()
Gets the maximum X coordinate within the map, including MP_VOID.
CommandCost CmdLandscapeClear(DoCommandFlag flags, TileIndex tile)
Clear a piece of landscape.
static T abs(const T a)
Returns the absolute value of (scalar) variable.
#define TILE_ADDXY(tile, x, y)
Adds a given offset to a tile.
static bool IsDockingTile(TileIndex t)
Checks whether the tile is marked as a dockling tile.
#define lengthof(x)
Return the length of an fixed size array.
Data structure to convert between Date and triplet (year, month, and day).
std::tuple< CommandCost, Money > CmdClearArea(DoCommandFlag flags, TileIndex tile, TileIndex start_tile, bool diagonal)
Clear a big piece of landscape.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
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"...
static const uint TILE_HEIGHT
Height of a height level in world coordinate AND in pixels in #ZOOM_LVL_BASE.
static bool MakeLake(TileIndex tile, void *user_data)
Make a connected lake; fill all tiles in the circular tile search that are connected.
@ GWP_RIVER
Create the rivers.
byte snow_coverage
the amount of snow coverage on the map
byte river_route_random
the amount of randomicity for the route finding
static uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
TileIndex tile
Tile index.
ConstructionSettings construction
construction of things in-game
static bool IsInclinedSlope(Slope s)
Tests if a specific slope is an inclined slope.
@ SLOPE_STEEP_W
a steep slope falling to east (from west)
void ClearSnowLine()
Clear the variable snow line table and free the memory.
static const uint TILE_PIXELS
Pixel distance between tile columns/rows in #ZOOM_LVL_BASE.
static TileType GetTileType(TileIndex tile)
Get the tiletype of a given tile.
DetailedFileType detail_ftype
Concrete file type (PNG, BMP, old save, etc).
@ TROPICZONE_NORMAL
Normal tropiczone.
bool main_river
Whether the current river is a big river that others flow into.
static uint River_Hash(uint tile, uint dir)
Simple hash function for river tiles to be used by AyStar.
static void Swap(T &a, T &b)
Type safe swap operation.
static Slope HalftileSlope(Slope s, Corner corner)
Adds a halftile slope to a slope.
uint ApplyFoundationToSlope(Foundation f, Slope *s)
Applies a foundation to a slope.
static const uint CUSTOM_SEA_LEVEL_NUMBER_DIFFICULTY
Value for custom sea level in difficulty settings.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
const TileTypeProcs _tile_type_road_procs
Tile callback functions for road tiles.
uint64 _tick_counter
Ever incrementing tick counter for setting off various events.
static bool RiverMakeWider(TileIndex tile, void *data)
Widen a river by expanding into adjacent tiles via circular tile search.
@ DIAGDIR_NE
Northeast, upper right on your monitor.
Keeps track of removed objects during execution/testruns of commands.
void AddStartNode(AyStarNode *start_node, uint g)
Adds a node from where to start an algorithm.
static TileIndexDiffC TileIndexDiffCByDiagDir(DiagDirection dir)
Returns the TileIndexDiffC offset from a DiagDirection.
void OnTick_LinkGraph()
Spawn or join a link graph job or compress a link graph if any link graph is due to do so.
Data structure describing a sprite.
@ SLOPE_STEEP
indicates the slope is steep
static uint MapLogY()
Logarithm of the map size along the y side.
static bool IsLeveledFoundation(Foundation f)
Tests if the foundation is a leveled foundation.
static Slope ComplementSlope(Slope s)
Return the complement of a slope.
static Corner GetHalftileFoundationCorner(Foundation f)
Returns the halftile corner of a halftile-foundation.
@ ST_MAPGEN
Special sprite for the map generator.
@ SLOPE_STEEP_N
a steep slope falling to south (from north)
static void MakeRiver(TileIndex t, uint8 random_bits)
Make a river tile.
static const uint RIVER_HASH_SIZE
The number of bits the hash for river finding should have.
bool RiverModifyDesertZone(TileIndex tile, void *data)
Callback to create non-desert around a river tile.
static DiagDirection GetInclinedSlopeDirection(Slope s)
Returns the direction of an inclined slope.
static TileIndex TileVirtXY(uint x, uint y)
Get a tile from the virtual XY-coordinate.
void RunTileLoop()
Gradually iterate over all tiles on the map, calling their TileLoopProcs once every 256 ticks.
static const uint SNOW_LINE_MONTHS
Number of months in the snow line table.