OpenTTD Source 20260129-master-g2bb01bd0e4
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
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
26static CommandCost ClearTile_Clear(TileIndex tile, DoCommandFlags flags)
27{
28 static constexpr Price clear_price_table[] = {
35 };
37
38 ClearGround ground = GetClearGround(tile);
39 uint8_t density = GetClearDensity(tile);
40 if (IsSnowTile(tile)) {
41 price.AddCost(_price[clear_price_table[ground]]);
42 /* Add a little more for removing snow. */
43 price.AddCost(std::abs(_price[Price::ClearRough] - _price[Price::ClearGrass]));
44 } else if (ground != CLEAR_GRASS || density != 0) {
45 price.AddCost(_price[clear_price_table[ground]]);
46 }
47
48 if (flags.Test(DoCommandFlag::Execute)) DoClearSquare(tile);
49
50 return price;
51}
52
53void DrawClearLandTile(const TileInfo *ti, uint8_t set)
54{
55 DrawGroundSprite(SPR_FLAT_BARE_LAND + SlopeToSpriteOffset(ti->tileh) + set * 19, PAL_NONE);
56}
57
58void DrawHillyLandTile(const TileInfo *ti)
59{
60 if (ti->tileh != SLOPE_FLAT) {
61 DrawGroundSprite(SPR_FLAT_ROUGH_LAND + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
62 } else {
63 DrawGroundSprite(_landscape_clear_sprites_rough[GB(TileHash(ti->x, ti->y), 0, 3)], PAL_NONE);
64 }
65}
66
67static void DrawClearLandFence(const TileInfo *ti)
68{
69 /* combine fences into one sprite object */
71
72 SpriteBounds bounds{{}, {TILE_SIZE, TILE_SIZE, 4}, {}};
73
74 bounds.extent.z += GetSlopeMaxPixelZ(ti->tileh);
75
76 uint fence_nw = GetFence(ti->tile, DIAGDIR_NW);
77 if (fence_nw != 0) {
78 bounds.offset.x = 0;
79 bounds.offset.y = -static_cast<int>(TILE_SIZE);
80 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_W);
81 SpriteID sprite = _clear_land_fence_sprites[fence_nw - 1] + _fence_mod_by_tileh_nw[ti->tileh];
82 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
83 }
84
85 uint fence_ne = GetFence(ti->tile, DIAGDIR_NE);
86 if (fence_ne != 0) {
87 bounds.offset.x = -static_cast<int>(TILE_SIZE);
88 bounds.offset.y = 0;
89 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_E);
90 SpriteID sprite = _clear_land_fence_sprites[fence_ne - 1] + _fence_mod_by_tileh_ne[ti->tileh];
91 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
92 }
93
94 uint fence_sw = GetFence(ti->tile, DIAGDIR_SW);
95 uint fence_se = GetFence(ti->tile, DIAGDIR_SE);
96
97 if (fence_sw != 0 || fence_se != 0) {
98 bounds.offset.x = 0;
99 bounds.offset.y = 0;
100 bounds.offset.z = GetSlopePixelZInCorner(ti->tileh, CORNER_S);
101
102 if (fence_sw != 0) {
103 SpriteID sprite = _clear_land_fence_sprites[fence_sw - 1] + _fence_mod_by_tileh_sw[ti->tileh];
104 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
105 }
106
107 if (fence_se != 0) {
108 SpriteID sprite = _clear_land_fence_sprites[fence_se - 1] + _fence_mod_by_tileh_se[ti->tileh];
109 AddSortableSpriteToDraw(sprite, PAL_NONE, *ti, bounds, false);
110
111 }
112 }
114}
115
116static void DrawTile_Clear(TileInfo *ti)
117{
118 if (IsSnowTile(ti->tile)) {
119 uint8_t density = GetClearDensity(ti->tile);
120 DrawGroundSprite(_clear_land_sprites_snow_desert[density] + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
121 if (GetClearGround(ti->tile) == CLEAR_ROCKS) {
122 /* There 4 levels of snowy overlay rocks, each with 19 sprites. */
123 ++density;
124 DrawGroundSprite(SPR_OVERLAY_ROCKS_BASE + (density * 19) + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
125 }
126
127 DrawBridgeMiddle(ti, {});
128 return;
129 }
130
131 switch (GetClearGround(ti->tile)) {
132 case CLEAR_GRASS:
133 DrawClearLandTile(ti, GetClearDensity(ti->tile));
134 break;
135
136 case CLEAR_ROUGH:
137 DrawHillyLandTile(ti);
138 break;
139
140 case CLEAR_ROCKS:
142 DrawGroundSprite(_clear_land_sprites_snow_desert[GetClearDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
144 } else {
145 DrawGroundSprite((HasGrfMiscBit(GrfMiscBit::SecondRockyTileSet) && (TileHash(ti->x, ti->y) & 1) ? SPR_FLAT_ROCKY_LAND_2 : SPR_FLAT_ROCKY_LAND_1) + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
146 }
147 break;
148
149 case CLEAR_FIELDS:
150 DrawGroundSprite(_clear_land_sprites_farmland[GetFieldType(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
151 DrawClearLandFence(ti);
152 break;
153
154 case CLEAR_DESERT:
155 DrawGroundSprite(_clear_land_sprites_snow_desert[GetClearDensity(ti->tile)] + SlopeToSpriteOffset(ti->tileh), PAL_NONE);
156 break;
157 }
158
159 DrawBridgeMiddle(ti, {});
160}
161
162static int GetSlopePixelZ_Clear(TileIndex tile, uint x, uint y, bool)
163{
164 auto [tileh, z] = GetTilePixelSlope(tile);
165
166 return z + GetPartialPixelZ(x & 0xF, y & 0xF, tileh);
167}
168
169static Foundation GetFoundation_Clear(TileIndex, Slope)
170{
171 return FOUNDATION_NONE;
172}
173
174static void UpdateFences(TileIndex tile)
175{
176 assert(IsTileType(tile, TileType::Clear) && IsClearGround(tile, CLEAR_FIELDS));
177 bool dirty = false;
178
179 for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
180 if (GetFence(tile, dir) != 0) continue;
181 TileIndex neighbour = tile + TileOffsByDiagDir(dir);
182 if (IsTileType(neighbour, TileType::Clear) && IsClearGround(neighbour, CLEAR_FIELDS)) continue;
183 SetFence(tile, dir, 3);
184 dirty = true;
185 }
186
187 if (dirty) MarkTileDirtyByTile(tile);
188}
189
190
193{
194 int k = GetTileZ(tile) - GetSnowLine() + 1;
195
196 if (!IsSnowTile(tile)) {
197 /* Below the snow line, do nothing if no snow. */
198 /* At or above the snow line, make snow tile if needed. */
199 if (k >= 0) {
200 /* Snow density is started at 0 so that it can gradually reach the required density. */
201 MakeSnow(tile, 0);
203 }
204 return;
205 }
206
207 /* Update snow density. */
208 uint current_density = GetClearDensity(tile);
209 uint req_density = (k < 0) ? 0u : std::min<uint>(k, 3u);
210
211 if (current_density == req_density) {
212 /* Density at the required level. */
213 if (k >= 0) return;
214 ClearSnow(tile);
215 } else {
216 AddClearDensity(tile, current_density < req_density ? 1 : -1);
217 }
218
220}
221
227static inline bool NeighbourIsNormal(TileIndex tile)
228{
229 for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
230 TileIndex t = tile + TileOffsByDiagDir(dir);
231 if (!IsValidTile(t)) continue;
232 if (GetTropicZone(t) != TROPICZONE_DESERT) return true;
233 if (HasTileWaterClass(t) && GetWaterClass(t) == WaterClass::Sea) return true;
234 }
235 return false;
236}
237
238static void TileLoopClearDesert(TileIndex tile)
239{
240 ClearGround ground = GetClearGround(tile);
241
242 /* Current desert level - 0 if it is not desert */
243 uint current = 0;
244 if (ground == CLEAR_DESERT || ground == CLEAR_ROCKS) current = GetClearDensity(tile);
245
246 /* Expected desert level - 0 if it shouldn't be desert */
247 uint expected = 0;
248 if (GetTropicZone(tile) == TROPICZONE_DESERT) {
249 expected = NeighbourIsNormal(tile) ? 1 : 3;
250 }
251
252 if (current == expected) return;
253
254 if (ground == CLEAR_ROCKS) {
255 SetClearGroundDensity(tile, CLEAR_ROCKS, expected);
256 } else if (expected == 0) {
258 } else {
259 /* Transition from clear to desert is not smooth (after clearing desert tile) */
260 SetClearGroundDensity(tile, CLEAR_DESERT, expected);
261 }
262
264}
265
266static void TileLoop_Clear(TileIndex tile)
267{
268 AmbientSoundEffect(tile);
269
271 case LandscapeType::Tropic: TileLoopClearDesert(tile); break;
272 case LandscapeType::Arctic: TileLoopClearAlps(tile); break;
273 default: break;
274 }
275
276 if (IsSnowTile(tile)) return;
277
278 switch (GetClearGround(tile)) {
279 case CLEAR_GRASS:
280 if (GetClearDensity(tile) == 3) return;
281
282 if (_game_mode != GM_EDITOR) {
283 if (GetClearCounter(tile) < 7) {
284 AddClearCounter(tile, 1);
285 return;
286 } else {
287 SetClearCounter(tile, 0);
288 AddClearDensity(tile, 1);
289 }
290 } else {
291 SetClearGroundDensity(tile, GB(Random(), 0, 8) > 21 ? CLEAR_GRASS : CLEAR_ROUGH, 3);
292 }
293 break;
294
295 case CLEAR_FIELDS:
296 UpdateFences(tile);
297
298 if (_game_mode == GM_EDITOR) return;
299
300 if (GetClearCounter(tile) < 7) {
301 AddClearCounter(tile, 1);
302 return;
303 } else {
304 SetClearCounter(tile, 0);
305 }
306
307 if (GetIndustryIndexOfField(tile) == IndustryID::Invalid() && GetFieldType(tile) >= 7) {
308 /* This farmfield is no longer farmfield, so make it grass again */
309 MakeClear(tile, CLEAR_GRASS, 2);
310 } else {
311 uint field_type = GetFieldType(tile);
312 field_type = (field_type < 8) ? field_type + 1 : 0;
313 SetFieldType(tile, field_type);
314 }
315 break;
316
317 default:
318 return;
319 }
320
322}
323
324void GenerateClearTile()
325{
326 uint i, gi;
327 TileIndex tile;
328
329 /* add rough tiles */
330 i = Map::ScaleBySize(GB(Random(), 0, 10) + 0x400);
331 gi = Map::ScaleBySize(GB(Random(), 0, 7) + 0x80);
332
334 do {
336 tile = RandomTile();
338 } while (--i);
339
340 /* add rocky tiles */
341 i = gi;
342 do {
343 uint32_t r = Random();
344 tile = RandomTileSeed(r);
345
347 if (IsTileType(tile, TileType::Clear)) {
348 uint j = GB(r, 16, 4) + 5;
349 for (;;) {
350 TileIndex tile_new;
351
354 do {
355 if (--j == 0) goto get_out;
356 tile_new = tile + TileOffsByDiagDir((DiagDirection)GB(Random(), 0, 2));
357 } while (!IsTileType(tile_new, TileType::Clear));
358 tile = tile_new;
359 }
360get_out:;
361 }
362 } while (--i);
363}
364
365static TrackStatus GetTileTrackStatus_Clear(TileIndex, TransportType, uint, DiagDirection)
366{
367 return 0;
368}
369
370static void GetTileDesc_Clear(TileIndex tile, TileDesc &td)
371{
372 /* Each pair holds a normal and a snowy ClearGround description. */
373 static constexpr std::pair<StringID, StringID> clear_land_str[] = {
374 {STR_LAI_CLEAR_DESCRIPTION_GRASS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_GRASS},
375 {STR_LAI_CLEAR_DESCRIPTION_ROUGH_LAND, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROUGH_LAND},
376 {STR_LAI_CLEAR_DESCRIPTION_ROCKS, STR_LAI_CLEAR_DESCRIPTION_SNOWY_ROCKS},
377 {STR_LAI_CLEAR_DESCRIPTION_FIELDS, STR_EMPTY},
378 {STR_EMPTY, STR_EMPTY}, // unused entry does not appear in the map.
379 {STR_LAI_CLEAR_DESCRIPTION_DESERT, STR_EMPTY},
380 };
381
382 if (!IsSnowTile(tile) && IsClearGround(tile, CLEAR_GRASS) && GetClearDensity(tile) == 0) {
383 td.str = STR_LAI_CLEAR_DESCRIPTION_BARE_LAND;
384 } else {
385 const auto &[name, snowy_name] = clear_land_str[GetClearGround(tile)];
386 td.str = IsSnowTile(tile) ? snowy_name : name;
387 }
388 td.owner[0] = GetTileOwner(tile);
389}
390
391static void ChangeTileOwner_Clear(TileIndex, Owner, Owner)
392{
393 return;
394}
395
396static CommandCost TerraformTile_Clear(TileIndex tile, DoCommandFlags flags, int, Slope)
397{
398 return Command<Commands::LandscapeClear>::Do(flags, tile);
399}
400
401static CommandCost CheckBuildAbove_Clear(TileIndex, DoCommandFlags, Axis, int)
402{
403 /* Can always build above clear tiles. */
404 return CommandCost();
405}
406
407extern const TileTypeProcs _tile_type_clear_procs = {
408 DrawTile_Clear,
409 GetSlopePixelZ_Clear,
410 ClearTile_Clear,
411 nullptr,
412 GetTileDesc_Clear,
413 GetTileTrackStatus_Clear,
414 nullptr,
415 nullptr,
416 TileLoop_Clear,
417 ChangeTileOwner_Clear,
418 nullptr,
419 nullptr,
420 GetFoundation_Clear,
421 TerraformTile_Clear,
422 CheckBuildAbove_Clear, // check_build_above_proc
423};
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.
Enum-as-bit-set wrapper.
static bool NeighbourIsNormal(TileIndex tile)
Tests if at least one surrounding tile is non-desert.
static void TileLoopClearAlps(TileIndex tile)
Convert to or from snowy tiles.
Tables with sprites for clear land and fences.
Map accessors for 'clear' tiles.
void SetFieldType(Tile t, uint f)
Set the field type (production stage) of the field.
Definition clear_map.h:170
void AddClearCounter(Tile t, int c)
Increments the counter used to advance to the next clear density/field type.
Definition clear_map.h:119
uint GetFieldType(Tile t)
Get the field type (production stage) of the field.
Definition clear_map.h:158
void AddClearDensity(Tile t, int d)
Increment the density of a non-field clear tile.
Definition clear_map.h:82
void ClearSnow(Tile t)
Clear the snow from a tile and return it to its previous type.
Definition clear_map.h:303
bool IsClearGround(Tile t, ClearGround ct)
Set the type of clear tile.
Definition clear_map.h:58
void MakeSnow(Tile t, uint density=0)
Make a snow tile.
Definition clear_map.h:287
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:227
IndustryID GetIndustryIndexOfField(Tile t)
Get the industry (farm) that made the field.
Definition clear_map.h:182
ClearGround
Ground types.
Definition clear_map.h:19
@ CLEAR_GRASS
0-3
Definition clear_map.h:20
@ CLEAR_FIELDS
3
Definition clear_map.h:23
@ CLEAR_DESERT
1,3
Definition clear_map.h:24
@ CLEAR_ROUGH
3
Definition clear_map.h:21
@ CLEAR_ROCKS
3
Definition clear_map.h:22
void MakeClear(Tile t, ClearGround g, uint density)
Make a clear tile.
Definition clear_map.h:246
ClearGround GetClearGround(Tile t)
Get the type of clear tile.
Definition clear_map.h:46
void SetClearCounter(Tile t, uint c)
Sets the counter used to advance to the next clear density/field type.
Definition clear_map.h:131
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:145
uint GetFence(Tile t, DiagDirection side)
Is there a fence at the given border?
Definition clear_map.h:208
uint GetClearCounter(Tile t)
Get the counter used to advance to the next clear density/field type.
Definition clear_map.h:107
bool IsSnowTile(Tile t)
Test if a tile is covered with snow.
Definition clear_map.h:34
uint GetClearDensity(Tile t)
Get the density of a non-field clear tile.
Definition clear_map.h:70
Functions related to commands.
@ Execute
execute the given command
Axis
Allow incrementing of DiagDirDiff variables.
DiagDirection
Enumeration for diagonal directions.
@ DIAGDIR_NE
Northeast, upper right on your monitor.
@ DIAGDIR_NW
Northwest.
@ DIAGDIR_SE
Southeast.
@ DIAGDIR_END
Used for iterations.
@ DIAGDIR_BEGIN
Used for iterations.
@ DIAGDIR_SW
Southwest.
@ EXPENSES_CONSTRUCTION
Construction costs.
Price
Enumeration of all base prices for use with Prices.
@ ClearRough
Price for destroying rough land.
@ ClearRocks
Price for destroying rocks.
@ ClearFields
Price for destroying fields.
@ ClearGrass
Price for destroying grass.
Functions related to world/map generation.
void IncreaseGeneratingWorldProgress(GenWorldProgress cls)
Increases the current stage of the world generation with one.
@ GWP_ROUGH_ROCKY
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,.
@ Random
Randomise borders.
TileIndex RandomTileSeed(uint32_t r)
Get a random tile out of a given seed.
Definition map_func.h:653
#define RandomTile()
Get a valid random tile.
Definition map_func.h:664
TileIndexDiff TileOffsByDiagDir(DiagDirection dir)
Convert a DiagDirection to a TileIndexDiff.
Definition map_func.h:582
bool HasGrfMiscBit(GrfMiscBit bit)
Check for grf miscellaneous bits.
Definition newgrf.h:211
@ SecondRockyTileSet
Enable using the second rocky tile set.
Functions related to generic callbacks.
void AmbientSoundEffect(TileIndex tile)
Play an ambient sound effect for an empty tile.
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:415
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:173
Slope
Enumeration for the slope-type.
Definition slope_type.h:47
@ SLOPE_FLAT
a flat tile
Definition slope_type.h:48
Foundation
Enumeration for Foundations.
Definition slope_type.h:92
@ FOUNDATION_NONE
The tile has no foundation, the slope remains unchanged.
Definition slope_type.h:93
This file contains all sprite-related enums and defines.
static constexpr SpriteID SPR_OVERLAY_ROCKS_BASE
Overlay rocks sprites.
Definition sprites.h:321
Definition of base types and functions in a cross-platform compatible way.
T x
X coordinate.
T y
Y coordinate.
T z
Z coordinate.
LandscapeType landscape
the landscape we're currently in
GameCreationSettings game_creation
settings used during the creation of a game (map)
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:340
Coord3D< uint8_t > extent
Size of bounding box.
Definition sprite.h:20
Tile description for the 'land area information' tool.
Definition tile_cmd.h:38
StringID str
Description of the tile.
Definition tile_cmd.h:39
std::array< Owner, 4 > owner
Name of the owner(s)
Definition tile_cmd.h:41
Tile information, used while rendering the tile.
Definition tile_cmd.h:32
Slope tileh
Slope of the tile.
Definition tile_cmd.h:33
TileIndex tile
Tile index.
Definition tile_cmd.h:34
Set of callback functions for performing tile operations of a given tile type.
Definition tile_cmd.h:154
int GetTileZ(TileIndex tile)
Get bottom height of the tile.
Definition tile_map.cpp:116
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
@ TROPICZONE_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.
TransportType
Available types of transport.
void StartSpriteCombine()
Starts a block of sprites, which are "combined" into a single bounding box.
Definition viewport.cpp:764
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:663
void EndSpriteCombine()
Terminates a block of sprites started by StartSpriteCombine.
Definition viewport.cpp:774
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.
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