OpenTTD Source 20260711-master-g3fb3006dff
clear_cmd.cpp
Go to the documentation of this file.
1/*
2 * This file is part of OpenTTD.
3 * 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.
4 * 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.
5 * 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>.
6 */
7
9
10#include "stdafx.h"
11#include "clear_map.h"
12#include "command_func.h"
13#include "landscape.h"
14#include "genworld.h"
15#include "viewport_func.h"
16#include "core/random_func.hpp"
17#include "newgrf_generic.h"
18#include "landscape_cmd.h"
19
20#include "table/strings.h"
21#include "table/sprites.h"
22#include "table/clear_land.h"
23
24#include "safeguards.h"
25
28{
29 static constexpr EnumIndexArray<Price, ClearGround, ClearGround::MaxSize> clear_price_table{
30 Price::ClearGrass, // Base price for clearing grass.
31 Price::ClearRough, // Base price for clearing rough land.
32 Price::ClearRocks, // Base price for clearing rocks.
33 Price::ClearFields, // Base price for clearing fields.
34 Price::ClearRough, // Unused.
35 Price::ClearRough, // Base price for clearing desert.
36 Price::ClearRough, // Unused.
37 Price::ClearRough, // Unused.
38 };
40
41 ClearGround ground = GetClearGround(tile);
42 uint8_t density = GetClearDensity(tile);
43 if (IsSnowTile(tile)) {
44 price.AddCost(_price[clear_price_table[ground]]);
45 /* Add a little more for removing snow. */
47 } else if (ground != ClearGround::Grass || density != 0) {
48 price.AddCost(_price[clear_price_table[ground]]);
49 }
50
51 if (flags.Test(DoCommandFlag::Execute)) DoClearSquare(tile);
52
53 return price;
54}
55
61void DrawClearLandTile(const TileInfo *ti, uint8_t density)
62{
64}
65
71{
72 if (ti->tileh != SLOPE_FLAT) {
74 } else {
75 DrawGroundSprite(_landscape_clear_sprites_rough[GB(TileHash(ti->x, ti->y), 0, 3)], PAL_NONE);
76 }
77}
78
83static void DrawClearLandFence(const TileInfo *ti)
84{
85 /* combine fences into one sprite object */
87
88 SpriteBounds bounds{{}, {TILE_SIZE, TILE_SIZE, 4}, {}};
89
90 bounds.extent.z += GetSlopeMaxPixelZ(ti->tileh);
91
92 uint fence_nw = GetFence(ti->tile, DiagDirection::NW);
93 if (fence_nw != 0) {
94 bounds.offset.x = 0;
95 bounds.offset.y = -static_cast<int>(TILE_SIZE);
96 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_W);
98 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
99 }
100
101 uint fence_ne = GetFence(ti->tile, DiagDirection::NE);
102 if (fence_ne != 0) {
103 bounds.offset.x = -static_cast<int>(TILE_SIZE);
104 bounds.offset.y = 0;
105 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_E);
107 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
108 }
109
110 uint fence_sw = GetFence(ti->tile, DiagDirection::SW);
111 uint fence_se = GetFence(ti->tile, DiagDirection::SE);
112
113 if (fence_sw != 0 || fence_se != 0) {
114 bounds.offset.x = 0;
115 bounds.offset.y = 0;
116 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_S);
117
118 if (fence_sw != 0) {
120 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
121 }
122
123 if (fence_se != 0) {
125 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
126
127 }
128 }
130}
131
133static void DrawTile_Clear(TileInfo *ti)
134{
135 if (IsSnowTile(ti->tile)) {
136 uint8_t density = GetClearDensity(ti->tile);
139 /* There 4 levels of snowy overlay rocks, each with 19 sprites. */
140 ++density;
141 DrawGroundSprite(SPR_OVERLAY_ROCKS_BASE + (density * 19) + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
142 }
143
144 DrawBridgeMiddle(ti, {});
145 return;
146 }
147
148 switch (GetClearGround(ti->tile)) {
151 break;
152
155 break;
156
161 } else {
163 }
164 break;
165
169 break;
170
173 break;
174
175 default:
176 NOT_REACHED();
177 }
178
179 DrawBridgeMiddle(ti, {});
180}
181
183static int GetSlopePixelZ_Clear(TileIndex tile, uint x, uint y, [[maybe_unused]] bool ground_vehicle)
184{
185 auto [tileh, z] = GetTilePixelSlope(tile);
186
187 return z + GetPartialPixelZ(x & 0xF, y & 0xF, tileh);
188}
189
190static void UpdateFences(TileIndex tile)
191{
193 bool dirty = false;
194
196 if (GetFence(tile, dir) != 0) continue;
197 TileIndex neighbour = tile + TileOffsByDiagDir(dir);
198 if (IsTileType(neighbour, TileType::Clear) && IsClearGround(neighbour, ClearGround::Fields)) continue;
199 SetFence(tile, dir, 3);
200 dirty = true;
201 }
202
203 if (dirty) MarkTileDirtyByTile(tile);
204}
205
206
212{
213 int k = GetTileZ(tile) - GetSnowLine() + 1;
214
215 if (!IsSnowTile(tile)) {
216 /* Below the snow line, do nothing if no snow. */
217 /* At or above the snow line, make snow tile if needed. */
218 if (k >= 0) {
219 /* Snow density is started at 0 so that it can gradually reach the required density. */
220 MakeSnow(tile, 0);
222 }
223 return;
224 }
225
226 /* Update snow density. */
227 uint current_density = GetClearDensity(tile);
228 uint req_density = (k < 0) ? 0u : std::min<uint>(k, 3u);
229
230 if (current_density == req_density) {
231 /* Density at the required level. */
232 if (k >= 0) return;
233 ClearSnow(tile);
234 } else {
235 AddClearDensity(tile, current_density < req_density ? 1 : -1);
236 }
237
239}
240
246static inline bool NeighbourIsNormal(TileIndex tile)
247{
249 TileIndex t = tile + TileOffsByDiagDir(dir);
250 if (!IsValidTile(t)) continue;
251 if (GetTropicZone(t) != TropicZone::Desert) return true;
252 if (HasTileWaterClass(t) && GetWaterClass(t) == WaterClass::Sea) return true;
253 }
254 return false;
255}
256
257static void TileLoopClearDesert(TileIndex tile)
258{
259 ClearGround ground = GetClearGround(tile);
260
261 /* Current desert level - 0 if it is not desert */
262 uint current = 0;
263 if (ground == ClearGround::Desert || ground == ClearGround::Rocks) current = GetClearDensity(tile);
264
265 /* Expected desert level - 0 if it shouldn't be desert */
266 uint expected = 0;
267 if (GetTropicZone(tile) == TropicZone::Desert) {
268 expected = NeighbourIsNormal(tile) ? 1 : 3;
269 }
270
271 if (current == expected) return;
272
273 if (ground == ClearGround::Rocks) {
275 } else if (expected == 0) {
277 } else {
278 /* Transition from clear to desert is not smooth (after clearing desert tile) */
280 }
281
283}
284
286static void TileLoop_Clear(TileIndex tile)
287{
288 AmbientSoundEffect(tile);
289
290 switch (_settings_game.game_creation.landscape) {
291 case LandscapeType::Tropic: TileLoopClearDesert(tile); break;
292 case LandscapeType::Arctic: TileLoopClearAlps(tile); break;
293 default: break;
294 }
295
296 if (IsSnowTile(tile)) return;
297
298 switch (GetClearGround(tile)) {
300 if (GetClearDensity(tile) == 3) return;
301
302 if (_game_mode != GameMode::Editor) {
303 if (GetClearCounter(tile) < 7) {
304 AddClearCounter(tile, 1);
305 return;
306 } else {
307 SetClearCounter(tile, 0);
308 AddClearDensity(tile, 1);
309 }
310 } else {
311 SetClearGroundDensity(tile, GB(Random(), 0, 8) > 21 ? ClearGround::Grass : ClearGround::Rough, 3);
312 }
313 break;
314
316 UpdateFences(tile);
317
318 if (_game_mode == GameMode::Editor) return;
319
320 if (GetClearCounter(tile) < 7) {
321 AddClearCounter(tile, 1);
322 return;
323 } else {
324 SetClearCounter(tile, 0);
325 }
326
327 if (GetIndustryIndexOfField(tile) == IndustryID::Invalid() && GetFieldType(tile) >= 7) {
328 /* This farmfield is no longer farmfield, so make it grass again */
330 } else {
331 uint field_type = GetFieldType(tile);
332 field_type = (field_type < 8) ? field_type + 1 : 0;
333 SetFieldType(tile, field_type);
334 }
335 break;
336
337 default:
338 return;
339 }
340
342}
343
344void GenerateClearTile()
345{
346 uint i, gi;
347 TileIndex tile;
348
349 /* add rough tiles */
350 i = Map::ScaleBySize(GB(Random(), 0, 10) + 0x400);
351 gi = Map::ScaleBySize(GB(Random(), 0, 7) + 0x80);
352
354 do {
356 tile = RandomTile();
358 } while (--i);
359
360 /* add rocky tiles */
361 i = gi;
362 do {
363 uint32_t r = Random();
364 tile = RandomTileSeed(r);
365
367 if (IsTileType(tile, TileType::Clear)) {
368 uint j = GB(r, 16, 4) + 5;
369 for (;;) {
370 TileIndex tile_new;
371
374 do {
375 if (--j == 0) goto get_out;
376 tile_new = tile + TileOffsByDiagDir((DiagDirection)GB(Random(), 0, 2));
377 } while (!IsTileType(tile_new, TileType::Clear));
378 tile = tile_new;
379 }
380get_out:;
381 }
382 } while (--i);
383}
384
387{
388 /* Each pair holds a normal and a snowy ClearGround description. */
390 {STR_LAI_CLEAR_DESCRIPTION_GRASS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS}, // Description for grass.
391 {STR_LAI_CLEAR_DESCRIPTION_ROUGH_LAND, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND}, // Description for rough land.
392 {STR_LAI_CLEAR_DESCRIPTION_ROCKS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS}, // Description for rocks.
393 {STR_LAI_CLEAR_DESCRIPTION_FIELDS, STR_EMPTY}, // Description for fields.
394 {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map.
395 {STR_LAI_CLEAR_DESCRIPTION_DESERT, STR_EMPTY}, // Description for desert.
396 {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map.
397 {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map.
398 }}};
399
400 if (!IsSnowTile(tile) && IsClearGround(tile, ClearGround::Grass) && GetClearDensity(tile) == 0) {
401 td.str = STR_LAI_CLEAR_DESCRIPTION_BARE_LAND;
402 } else {
403 const auto &[name, snowy_name] = clear_land_str[GetClearGround(tile)];
404 td.str = IsSnowTile(tile) ? snowy_name : name;
405 }
406 td.owner[0] = GetTileOwner(tile);
407}
408
411 .draw_tile_proc = DrawTile_Clear,
412 .get_slope_pixel_z_proc = GetSlopePixelZ_Clear,
413 .clear_tile_proc = ClearTile_Clear,
414 .get_tile_desc_proc = GetTileDesc_Clear,
415 .tile_loop_proc = TileLoop_Clear,
416 .terraform_tile_proc = [](TileIndex tile, DoCommandFlags flags, int, Slope) { return Command<Commands::LandscapeClear>::Do(flags, tile); },
417 .check_build_above_proc = [](TileIndex, DoCommandFlags, Axis, int) { return CommandCost(); }, // Can always build above clear tiles
418};
static constexpr uint GB(const T x, const uint8_t s, const uint8_t n)
Fetch n bits from x, started at bit s.
void DrawBridgeMiddle(const TileInfo *ti, BridgePillarFlags blocked_pillars)
Draw the middle bits of a bridge.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
Common return value for all commands.
void AddCost(const Money &cost)
Adds the given cost to the cost of the command.
Iterate a range of enum values.
void DrawClearLandTile(const TileInfo *ti, uint8_t density)
Draw a ClearGround::Grass tile.
Definition clear_cmd.cpp:61
static CommandCost ClearTile_Clear(TileIndex tile, DoCommandFlags flags)
Tile callback function signature for clearing a tile.
Definition clear_cmd.cpp:27
static void GetTileDesc_Clear(TileIndex tile, TileDesc &td)
Tile callback function signature for obtaining a tile description.
void DrawRoughLandTile(const TileInfo *ti)
Draw a ClearGround::Rough tile.
Definition clear_cmd.cpp:70
static int GetSlopePixelZ_Clear(TileIndex tile, uint x, uint y, bool ground_vehicle)
Tile callback function signature for obtaining the world Z coordinate of a given point of a tile.
static bool NeighbourIsNormal(TileIndex tile)
Tests if at least one surrounding tile is non-desert.
static void DrawClearLandFence(const TileInfo *ti)
Draw the fences atop a ClearGround::Fields tile.
Definition clear_cmd.cpp:83
static void TileLoopClearAlps(TileIndex tile)
Convert to or from snowy tiles.
static void TileLoop_Clear(TileIndex tile)
Tile callback function signature for running periodic tile updates.
static void DrawTile_Clear(TileInfo *ti)
Tile callback function signature for drawing a tile and its contents to the screen.
const TileTypeProcs _tile_type_clear_procs
TileTypeProcs definitions for TileType::Clear tiles.
Tables with sprites for clear land and fences.
static const SpriteID _landscape_clear_sprites_rough[8]
Sprites of the random variants of rough grass sprites, for flat tiles only.
Definition clear_land.h:13
static const uint8_t _fence_mod_by_tileh_nw[32]
Sprite offset for sloped fences on the northwest edge of the tile.
Definition clear_land.h:49
static const uint8_t _fence_mod_by_tileh_se[32]
Sprite offset for sloped fences on the southeast edge of the tile.
Definition clear_land.h:33
static const SpriteID _clear_land_sprites_grass[4]
Sprites of the flat tile base for each density of clear -> grass transition.
Definition clear_land.h:80
static const SpriteID _clear_land_fence_sprites[7]
Sprites of the flat tile base for each type of farm field fence.
Definition clear_land.h:57
static const uint8_t _fence_mod_by_tileh_ne[32]
Sprite offset for sloped fences on the northeast edge of the tile.
Definition clear_land.h:41
static const SpriteID _clear_land_sprites_snow_desert[4]
Sprites of the flat tile base for each density of grass -> snow/desert transition.
Definition clear_land.h:88
static const SpriteID _clear_land_sprites_farmland[16]
Sprites of the flat tile base for each state of farm fields.
Definition clear_land.h:67
static const uint8_t _fence_mod_by_tileh_sw[32]
Sprite offset for sloped fences on the southwest edge of the tile.
Definition clear_land.h:25
Map accessors for 'clear' tiles.
void SetFieldType(Tile t, uint f)
Set the field type (production stage) of the field.
Definition clear_map.h:177
void AddClearCounter(Tile t, int c)
Increments the counter used to advance to the next clear density/field type.
Definition clear_map.h:126
uint GetFieldType(Tile t)
Get the field type (production stage) of the field.
Definition clear_map.h:165
void AddClearDensity(Tile t, int d)
Increment the density of a non-field clear tile.
Definition clear_map.h:89
void ClearSnow(Tile t)
Clear the snow from a tile and return it to its previous type.
Definition clear_map.h:310
bool IsClearGround(Tile t, ClearGround ct)
Set the type of clear tile.
Definition clear_map.h:65
void MakeSnow(Tile t, uint density=0)
Make a snow tile.
Definition clear_map.h:294
void SetFence(Tile t, DiagDirection side, uint h)
Sets the type of fence (and whether there is one) for the given border.
Definition clear_map.h:234
IndustryID GetIndustryIndexOfField(Tile t)
Get the industry (farm) that made the field.
Definition clear_map.h:189
ClearGround
Ground types.
Definition clear_map.h:21
@ Desert
Desert with transition (1,3).
Definition clear_map.h:26
@ MaxSize
The maximum possible number of clear ground types to be stored in map.
Definition clear_map.h:29
@ Rocks
Rocks with snow transition (0-3).
Definition clear_map.h:24
@ Fields
Farm fields (3).
Definition clear_map.h:25
@ Grass
Plain grass with dirt transition (0-3).
Definition clear_map.h:22
@ Rough
Rough mounds (3).
Definition clear_map.h:23
void MakeClear(Tile t, ClearGround g, uint density)
Make a clear tile.
Definition clear_map.h:253
ClearGround GetClearGround(Tile t)
Get the type of clear tile.
Definition clear_map.h:52
void SetClearCounter(Tile t, uint c)
Sets the counter used to advance to the next clear density/field type.
Definition clear_map.h:138
void SetClearGroundDensity(Tile t, ClearGround type, uint density)
Sets ground type and density in one go, also sets the counter to 0.
Definition clear_map.h:152
uint GetFence(Tile t, DiagDirection side)
Is there a fence at the given border?
Definition clear_map.h:215
uint GetClearCounter(Tile t)
Get the counter used to advance to the next clear density/field type.
Definition clear_map.h:114
bool IsSnowTile(Tile t)
Test if a tile is covered with snow.
Definition clear_map.h:40
uint GetClearDensity(Tile t)
Get the density of a non-field clear tile.
Definition clear_map.h:77
Functions related to commands.
@ Execute
execute the given command
EnumBitSet< DoCommandFlag, uint16_t > DoCommandFlags
Bitset of DoCommandFlag elements.
Axis
Enumeration for the two axis X and Y.
DiagDirection
Enumeration for diagonal directions.
@ SW
Southwest.
@ NW
Northwest.
@ End
Used for iterations.
@ NE
Northeast, upper right on your monitor.
@ SE
Southeast.
Prices _price
Prices and also the fractional part.
Definition economy.cpp:106
@ Construction
Construction costs.
@ ClearRough
Price for destroying rough land.
@ ClearRocks
Price for destroying rocks.
@ ClearFields
Price for destroying fields.
@ ClearGrass
Price for destroying grass.
EnumClassIndexContainer< std::array< T, to_underlying(N)>, Index > EnumIndexArray
A typedef for EnumClassIndexContainer using std::array as the backing container type.
Functions related to world/map generation.
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
@ RoughAndRocks
Make rough and rocky areas.
Definition genworld.h:63
void SetGeneratingWorldProgress(GenWorldProgress cls, uint total)
Set the total of a stage of the world generation.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
Definition gfx_type.h:17
uint8_t GetSnowLine()
Get the current snow line, either variable or static.
void MarkTileDirtyByTile(TileIndex tile, int bridge_level_offset, int tile_height_override)
Mark a tile given by its index dirty for repaint.
uint GetPartialPixelZ(int x, int y, Slope corners)
Determines height at given coordinate of a slope.
Functions related to OTTD's landscape.
int GetSlopePixelZInCorner(Slope tileh, Corner corner)
Determine the Z height of a corner relative to TileZ.
Definition landscape.h:55
Command definitions related to landscape (slopes etc.).
@ Arctic
Landscape with snow levels.
@ Tropic
Landscape with distinct rainforests and deserts,.
TileIndex RandomTileSeed(uint32_t r)
Get a random tile out of a given seed.
Definition map_func.h:645
#define RandomTile()
Get a valid random tile.
Definition map_func.h:656
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:574
bool HasGrfMiscBit(GrfMiscBit bit)
Check for grf miscellaneous bits.
Definition newgrf.h:227
@ SecondRockyTileSet
Enable using the second rocky tile set.
Definition newgrf.h:72
Functions related to generic callbacks.
void AmbientSoundEffect(TileIndex tile)
Play an ambient sound effect for an empty tile.
@ Editor
In the scenario editor.
Definition openttd.h:21
Pseudo random number generator.
A number of safeguards to prevent using unsafe methods.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition settings.cpp:61
uint SlopeToSpriteOffset(Slope s)
Returns the Sprite offset for a given Slope.
Definition slope_func.h:423
static constexpr int GetSlopeMaxPixelZ(Slope s)
Returns the height of the highest corner of a slope relative to TileZ (= minimal height).
Definition slope_func.h:183
Slope
Enumeration for the slope-type.
Definition slope_type.h:53
@ SLOPE_FLAT
a flat tile
Definition slope_type.h:54
This file contains all sprite-related enums and defines.
static constexpr SpriteID SPR_OVERLAY_ROCKS_BASE
Definition sprites.h:360
static const SpriteID SPR_FLAT_ROCKY_LAND_1
Definition sprites.h:677
static const SpriteID SPR_FLAT_ROCKY_LAND_2
Definition sprites.h:678
static const SpriteID SPR_FLAT_ROUGH_LAND
Definition sprites.h:672
Definition of base types and functions in a cross-platform compatible way.
T x
X coordinate.
T y
Y coordinate.
T z
Z coordinate.
static uint ScaleBySize(uint n)
Scales the given value by the map size, where the given value is for a 256 by 256 map.
Definition map_func.h:331
Coord3D< int8_t > offset
Relative position of sprite from bounding box.
Definition sprite.h:21
Coord3D< uint8_t > extent
Size of bounding box.
Definition sprite.h:20
Tile description for the 'land area information' tool.
Definition tile_cmd.h:40
StringID str
Description of the tile.
Definition tile_cmd.h:41
std::array< Owner, 4 > owner
Name of the owner(s).
Definition tile_cmd.h:43
Tile information, used while rendering the tile.
Definition tile_cmd.h:34
Slope tileh
Slope of the tile.
Definition tile_cmd.h:35
TileIndex tile
Tile index.
Definition tile_cmd.h:36
Set of callback functions for performing tile operations of a given tile type.
Definition tile_cmd.h:214
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
Definition tile_map.cpp:115
static bool IsTileType(Tile tile, TileType type)
Checks if a tile is a given tiletype.
Definition tile_map.h:150
uint TileHash(uint x, uint y)
Calculate a hash value from a tile position.
Definition tile_map.h:324
Owner GetTileOwner(Tile tile)
Returns the owner of a tile.
Definition tile_map.h:178
std::tuple< Slope, int > GetTilePixelSlope(TileIndex tile)
Return the slope of a given tile.
Definition tile_map.h:289
bool IsValidTile(Tile tile)
Checks if a tile is valid.
Definition tile_map.h:161
TropicZone GetTropicZone(Tile tile)
Get the tropic zone.
Definition tile_map.h:238
StrongType::Typedef< uint32_t, struct TileIndexTag, StrongType::Compare, StrongType::Integer, StrongType::Compatible< int32_t >, StrongType::Compatible< int64_t > > TileIndex
The index/ID of a Tile.
Definition tile_type.h:92
@ Desert
Tile is desert.
Definition tile_type.h:83
static constexpr uint TILE_SIZE
Tile size in world coordinates.
Definition tile_type.h:15
@ Clear
A tile without any structures, i.e. grass, rocks, farm fields etc.
Definition tile_type.h:49
void StartSpriteCombine()
Starts a block of sprites, which are "combined" into a single bounding box.
Definition viewport.cpp:765
void AddSortableSpriteToDraw(SpriteID image, PaletteID pal, int x, int y, int z, const SpriteBounds &bounds, bool transparent, const SubSprite *sub)
Draw a (transparent) sprite at given coordinates with a given bounding box.
Definition viewport.cpp:664
void EndSpriteCombine()
Terminates a block of sprites started by StartSpriteCombine.
Definition viewport.cpp:775
void DrawGroundSprite(SpriteID image, PaletteID pal, const SubSprite *sub, int extra_offs_x, int extra_offs_y)
Draws a ground sprite for the current tile.
Definition viewport.cpp:579
Functions related to (drawing on) viewports.
@ Sea
Sea.
Definition water_map.h:40
bool HasTileWaterClass(Tile t)
Checks whether the tile has an waterclass associated.
Definition water_map.h:103
WaterClass GetWaterClass(Tile t)
Get the water class at a tile.
Definition water_map.h:114