src/water_cmd.cpp
author rubidium
Thu, 24 Apr 2008 11:48:09 +0000
branch0.6
changeset 10323 57d8fd25473e
parent 9180 f39e3460f0ab
permissions -rw-r--r--
(svn r12864) [0.6] -Backport from trunk r12859, r12857, r12855, r12845, r12844:
- Fix: Make the town rating tests use less memory and much quicker (r12859)
- Fix: Usage of AutoPtr made (trying to) build stuff very expensive (r12857, r12855)
- Fix: Use YAPF for fairly old savegames from before YAPF was introduced (r12845)
- Fix: The industry tick trigger should only be triggered once every 256 ticks, not every tick... Also bail out of the triggers a little earlier if you know they are not going to happen anyway (r12844)
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
     3
/** @file water_cmd.cpp */
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
92a3b0aa0946 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1796
diff changeset
     6
#include "openttd.h"
3189
1af302c5abd0 (svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
tron
parents: 3183
diff changeset
     7
#include "bridge_map.h"
6486
4f8af35b11eb (svn r8908) -Codechange: declaration of DrawBridgeMiddle does not belong in a map accessors header.
rubidium
parents: 6460
diff changeset
     8
#include "bridge.h"
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6432
diff changeset
     9
#include "cmd_helper.h"
3338
2c60ed0dcce3 (svn r4120) Use the new station functions where appropriate
tron
parents: 3275
diff changeset
    10
#include "station_map.h"
8615
6b91ca653bad (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8612
diff changeset
    11
#include "tile_cmd.h"
6949
72d11a1e1e60 (svn r9609) -Codechange: Move some function prototypes out of functions.h and into landscape.h, and add a few where they didn't exist.
maedhros
parents: 6928
diff changeset
    12
#include "landscape.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8707
diff changeset
    13
#include "viewport_func.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8610
diff changeset
    14
#include "command_func.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    15
#include "town.h"
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
    16
#include "news.h"
1313
bba6afb8a995 (svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents: 1214
diff changeset
    17
#include "depot.h"
1752
cdbfb2f23e72 (svn r2256) - Fix: Trains cannot find a depot when they are in a tunnel. (glx)
matthijs
parents: 1632
diff changeset
    18
#include "vehicle_gui.h"
2676
2ba71e034d97 (svn r3218) -Feature: Multiheaded train engines will now stay in the same train
bjarni
parents: 2657
diff changeset
    19
#include "train.h"
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7179
diff changeset
    20
#include "roadveh.h"
8604
8afdd9877afd (svn r11669) -Codechange: refactor tile.h -> tile_type.h and tile_map.h
rubidium
parents: 8601
diff changeset
    21
#include "water.h"
3111
1edf71aa942e (svn r3714) Add functions to turn tiles into water and shore tiles
tron
parents: 3017
diff changeset
    22
#include "water_map.h"
8003
bd88e365c18a (svn r11022) -Fix: the canal border determination did not take oil rigs into consideration.
rubidium
parents: 7993
diff changeset
    23
#include "industry_map.h"
5210
dc52acfad05c (svn r7325) -Feature: Add support for action 5 type 0x0D, coast sprites.
peter1138
parents: 4848
diff changeset
    24
#include "newgrf.h"
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
    25
#include "newgrf_canal.h"
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8293
diff changeset
    26
#include "transparency.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8604
diff changeset
    27
#include "strings_func.h"
8627
448ebf3a8291 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 8615
diff changeset
    28
#include "functions.h"
448ebf3a8291 (svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents: 8615
diff changeset
    29
#include "window_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8635
diff changeset
    30
#include "vehicle_func.h"
8653
a83f7a536919 (svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents: 8640
diff changeset
    31
#include "sound_func.h"
8707
55835d8fbfcd (svn r11774) -Change: do not include variables.h in a header when it is not needed.
rubidium
parents: 8660
diff changeset
    32
#include "variables.h"
8750
fdd6054e7bae (svn r11818) -Codechange: split player.h into smaller pieces.
rubidium
parents: 8733
diff changeset
    33
#include "player_func.h"
8766
c86cfa3a7580 (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8760
diff changeset
    34
#include "settings_type.h"
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    35
#include "clear_map.h"
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
    36
#include "tree_map.h"
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
    37
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    38
#include "table/sprites.h"
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    39
#include "table/strings.h"
2261
3f78323707bb (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2186
diff changeset
    40
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    41
/**
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    42
 * Describes the behaviour of a tile during flooding.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    43
 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    44
enum FloodingBehaviour {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    45
	FLOOD_NONE,    ///< The tile does not flood neighboured tiles.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    46
	FLOOD_ACTIVE,  ///< The tile floods neighboured tiles.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    47
	FLOOD_PASSIVE, ///< The tile does not actively flood neighboured tiles, but it prevents them from drying up.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    48
	FLOOD_DRYUP,   ///< The tile drys up if it is not constantly flooded from neighboured tiles.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    49
};
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    50
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    51
/**
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    52
 * Describes from which directions a specific slope can be flooded (if the tile is floodable at all).
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    53
 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    54
static const uint8 _flood_from_dirs[] = {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    55
	(1 << DIR_NW) | (1 << DIR_SW) | (1 << DIR_SE) | (1 << DIR_NE), // SLOPE_FLAT
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    56
	(1 << DIR_NE) | (1 << DIR_SE),                                 // SLOPE_W
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    57
	(1 << DIR_NW) | (1 << DIR_NE),                                 // SLOPE_S
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    58
	(1 << DIR_NE),                                                 // SLOPE_SW
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    59
	(1 << DIR_NW) | (1 << DIR_SW),                                 // SLOPE_E
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    60
	0,                                                             // SLOPE_EW
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    61
	(1 << DIR_NW),                                                 // SLOPE_SE
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    62
	(1 << DIR_N ) | (1 << DIR_NW) | (1 << DIR_NE),                 // SLOPE_WSE, SLOPE_STEEP_S
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    63
	(1 << DIR_SW) | (1 << DIR_SE),                                 // SLOPE_N
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    64
	(1 << DIR_SE),                                                 // SLOPE_NW
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    65
	0,                                                             // SLOPE_NS
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    66
	(1 << DIR_E ) | (1 << DIR_NE) | (1 << DIR_SE),                 // SLOPE_NWS, SLOPE_STEEP_W
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    67
	(1 << DIR_SW),                                                 // SLOPE_NE
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    68
	(1 << DIR_S ) | (1 << DIR_SW) | (1 << DIR_SE),                 // SLOPE_ENW, SLOPE_STEEP_N
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    69
	(1 << DIR_W ) | (1 << DIR_SW) | (1 << DIR_NW),                 // SLOPE_SEN, SLOPE_STEEP_E
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    70
};
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    71
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
    72
/**
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    73
 * Marks tile dirty if it is a canal or river tile.
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    74
 * Called to avoid glitches when flooding tiles next to canal tile.
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    75
 *
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    76
 * @param tile tile to check
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    77
 */
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    78
static inline void MarkTileDirtyIfCanalOrRiver(TileIndex tile)
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    79
{
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    80
	if (IsTileType(tile, MP_WATER) && (IsCanal(tile) || IsRiver(tile))) MarkTileDirtyByTile(tile);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    81
}
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    82
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    83
/**
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    84
 * Marks the tiles around a tile as dirty, if they are canals or rivers.
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    85
 *
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    86
 * @param tile The center of the tile where all other tiles are marked as dirty
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    87
 * @ingroup dirty
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    88
 */
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    89
static void MarkCanalsAndRiversAroundDirty(TileIndex tile)
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    90
{
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    91
	for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    92
		MarkTileDirtyIfCanalOrRiver(tile + TileOffsByDir(dir));
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    93
	}
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    94
}
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    95
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
    96
/**
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
    97
 * Makes a tile canal or water depending on the surroundings.
8991
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
    98
 *
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
    99
 * Must only be used for converting old savegames. Use WaterClass now.
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   100
 *
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   101
 * This as for example docks and shipdepots do not store
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   102
 * whether the tile used to be canal or 'normal' water.
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   103
 * @param t the tile to change.
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   104
 * @param o the owner of the new tile.
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   105
 */
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   106
void SetWaterClassDependingOnSurroundings(TileIndex t)
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   107
{
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   108
	assert(GetTileSlope(t, NULL) == SLOPE_FLAT);
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   109
8518
08fc9e9bbddd (svn r11582) -Fix: tiles were not marked dirty in some cases when removing a lock
smatz
parents: 8510
diff changeset
   110
	/* Mark tile dirty in all cases */
08fc9e9bbddd (svn r11582) -Fix: tiles were not marked dirty in some cases when removing a lock
smatz
parents: 8510
diff changeset
   111
	MarkTileDirtyByTile(t);
08fc9e9bbddd (svn r11582) -Fix: tiles were not marked dirty in some cases when removing a lock
smatz
parents: 8510
diff changeset
   112
9022
6a009a1106fd (svn r12101) -Fix (r12100): there are void tiles at MapMaxX,Y - have to substract one to be on water border tiles
smatz
parents: 9021
diff changeset
   113
	if (TileX(t) == 0 || TileY(t) == 0 || TileX(t) == MapMaxX() - 1 || TileY(t) == MapMaxY() - 1) {
9021
6cacfba4ef5e (svn r12100) -Fix (r12042): check for water class of surrounding tiles fails for buoys at map borders
smatz
parents: 9016
diff changeset
   114
		/* tiles at map borders are always WATER_CLASS_SEA */
6cacfba4ef5e (svn r12100) -Fix (r12042): check for water class of surrounding tiles fails for buoys at map borders
smatz
parents: 9016
diff changeset
   115
		SetWaterClass(t, WATER_CLASS_SEA);
6cacfba4ef5e (svn r12100) -Fix (r12042): check for water class of surrounding tiles fails for buoys at map borders
smatz
parents: 9016
diff changeset
   116
		return;
6cacfba4ef5e (svn r12100) -Fix (r12042): check for water class of surrounding tiles fails for buoys at map borders
smatz
parents: 9016
diff changeset
   117
	}
6cacfba4ef5e (svn r12100) -Fix (r12042): check for water class of surrounding tiles fails for buoys at map borders
smatz
parents: 9016
diff changeset
   118
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   119
	bool has_water = false;
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   120
	bool has_canal = false;
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   121
	bool has_river = false;
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   122
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   123
	for (DiagDirection dir = DIAGDIR_BEGIN; dir < DIAGDIR_END; dir++) {
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   124
		TileIndex neighbour = TileAddByDiagDir(t, dir);
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   125
		switch (GetTileType(neighbour)) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   126
			case MP_WATER:
8991
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   127
				/* clear water and shipdepots have already a WaterClass associated */
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   128
				if (IsCoast(neighbour)) {
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   129
					has_water = true;
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   130
				} else if (!IsLock(neighbour)) {
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   131
					switch (GetWaterClass(neighbour)) {
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   132
						case WATER_CLASS_SEA:   has_water = true; break;
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   133
						case WATER_CLASS_CANAL: has_canal = true; break;
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   134
						case WATER_CLASS_RIVER: has_river = true; break;
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   135
						default: NOT_REACHED();
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   136
					}
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   137
				}
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   138
				break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   139
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   140
			case MP_RAILWAY:
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   141
				/* Shore or flooded halftile */
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   142
				has_water |= (GetRailGroundType(neighbour) == RAIL_GROUND_WATER);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   143
				break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   144
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   145
			case MP_TREES:
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   146
				/* trees on shore */
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   147
				has_water |= (GetTreeGround(neighbour) == TREE_GROUND_SHORE);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   148
				break;
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   149
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   150
			default: break;
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   151
		}
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   152
	}
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   153
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   154
	if (has_river && !has_canal) {
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   155
		SetWaterClass(t, WATER_CLASS_RIVER);
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   156
	} else if (has_canal || !has_water) {
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   157
		SetWaterClass(t, WATER_CLASS_CANAL);
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   158
	} else {
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   159
		SetWaterClass(t, WATER_CLASS_SEA);
8444
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   160
	}
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   161
}
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   162
9317090e9c8c (svn r11504) -Fix [FS#1467]: removing docks/ship depots could result in non-canal water where canals should have been build.
rubidium
parents: 8424
diff changeset
   163
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1752
diff changeset
   164
/** Build a ship depot.
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   165
 * @param tile tile where ship depot is built
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   166
 * @param flags type of operation
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6432
diff changeset
   167
 * @param p1 bit 0 depot orientation (Axis)
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1752
diff changeset
   168
 * @param p2 unused
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   169
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   170
CommandCost CmdBuildShipDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   171
{
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   172
	TileIndex tile2;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   173
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   174
	CommandCost ret;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   175
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6432
diff changeset
   176
	Axis axis = Extract<Axis, 0>(p1);
b3017e083031 (svn r8876) -Fix
tron
parents: 6432
diff changeset
   177
b3017e083031 (svn r8876) -Fix
tron
parents: 6432
diff changeset
   178
	tile2 = tile + (axis == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   179
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   180
	if (!IsWaterTile(tile) || !IsWaterTile(tile2)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   181
		return_cmd_error(STR_3801_MUST_BE_BUILT_ON_WATER);
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   182
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   183
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   184
	if (IsBridgeAbove(tile) || IsBridgeAbove(tile2)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   185
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   186
	if (GetTileSlope(tile, NULL) != SLOPE_FLAT || GetTileSlope(tile2, NULL) != SLOPE_FLAT) {
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   187
		/* Prevent depots on rapids */
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   188
		return_cmd_error(STR_0239_SITE_UNSUITABLE);
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   189
	}
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   190
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   191
	WaterClass wc1 = GetWaterClass(tile);
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   192
	WaterClass wc2 = GetWaterClass(tile2);
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   193
	ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1752
diff changeset
   194
	if (CmdFailed(ret)) return CMD_ERROR;
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   195
	ret = DoCommand(tile2, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1752
diff changeset
   196
	if (CmdFailed(ret)) return CMD_ERROR;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   197
10323
57d8fd25473e (svn r12864) [0.6] -Backport from trunk r12859, r12857, r12855, r12845, r12844:
rubidium
parents: 9180
diff changeset
   198
	if (!Depot::CanAllocateItem()) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   199
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   200
	if (flags & DC_EXEC) {
10323
57d8fd25473e (svn r12864) [0.6] -Backport from trunk r12859, r12857, r12855, r12845, r12844:
rubidium
parents: 9180
diff changeset
   201
		Depot *depot = new Depot(tile);
1313
bba6afb8a995 (svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents: 1214
diff changeset
   202
		depot->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   203
8991
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   204
		MakeShipDepot(tile,  _current_player, DEPOT_NORTH, axis, wc1);
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   205
		MakeShipDepot(tile2, _current_player, DEPOT_SOUTH, axis, wc2);
3372
e9eaf986b264 (svn r4171) -Codechange: Create map accessor functions for creating ship depots and locks. Make use of them
celestar
parents: 3338
diff changeset
   206
		MarkTileDirtyByTile(tile);
e9eaf986b264 (svn r4171) -Codechange: Create map accessor functions for creating ship depots and locks. Make use of them
celestar
parents: 3338
diff changeset
   207
		MarkTileDirtyByTile(tile2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   208
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   209
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   210
	return CommandCost(EXPENSES_CONSTRUCTION, _price.build_ship_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   211
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   212
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   213
void MakeWaterKeepingClass(TileIndex tile, Owner o)
8525
9d0a7c52e3ed (svn r11589) -Fix [FS#1514]: when ship depots got destroyed they always returned to water, even when it should've been canals.
rubidium
parents: 8518
diff changeset
   214
{
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   215
	assert(IsTileType(tile, MP_WATER) || (IsTileType(tile, MP_STATION) && (IsBuoy(tile) || IsDock(tile))));
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   216
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   217
	switch (GetWaterClass(tile)) {
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   218
		case WATER_CLASS_SEA:   MakeWater(tile);              break;
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   219
		case WATER_CLASS_CANAL: MakeCanal(tile, o, Random()); break;
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   220
		case WATER_CLASS_RIVER: MakeRiver(tile, Random());    break;
8525
9d0a7c52e3ed (svn r11589) -Fix [FS#1514]: when ship depots got destroyed they always returned to water, even when it should've been canals.
rubidium
parents: 8518
diff changeset
   221
	}
9d0a7c52e3ed (svn r11589) -Fix [FS#1514]: when ship depots got destroyed they always returned to water, even when it should've been canals.
rubidium
parents: 8518
diff changeset
   222
}
9d0a7c52e3ed (svn r11589) -Fix [FS#1514]: when ship depots got destroyed they always returned to water, even when it should've been canals.
rubidium
parents: 8518
diff changeset
   223
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   224
static CommandCost RemoveShipDepot(TileIndex tile, uint32 flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   225
{
3373
f95cf3549591 (svn r4172) -Codechange: Added a few accessors to work with ShipDepots and Locks
celestar
parents: 3372
diff changeset
   226
	if (!IsShipDepot(tile)) return CMD_ERROR;
2951
2db3adee7736 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   227
	if (!CheckTileOwnership(tile)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   228
9016
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
   229
	TileIndex tile2 = GetOtherShipDepotTile(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   230
9016
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
   231
	/* do not check for ship on tile when company goes bankrupt */
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
   232
	if (!(flags & DC_BANKRUPT)) {
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
   233
		if (!EnsureNoVehicleOnGround(tile) || !EnsureNoVehicleOnGround(tile2)) return CMD_ERROR;
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
   234
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   235
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   236
	if (flags & DC_EXEC) {
3373
f95cf3549591 (svn r4172) -Codechange: Added a few accessors to work with ShipDepots and Locks
celestar
parents: 3372
diff changeset
   237
		/* Kill the depot, which is registered at the northernmost tile. Use that one */
7885
4eb9b01e37ff (svn r10758) -Codechange: make the depot struct use the pool item class as super class.
rubidium
parents: 7831
diff changeset
   238
		delete GetDepotByTile(tile2 < tile ? tile2 : tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   239
8991
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   240
		MakeWaterKeepingClass(tile,  GetTileOwner(tile));
072c784ccb82 (svn r12070) -Cleanup(r12042): Water-owner of shipdepots is no longer needed. Removed.
frosch
parents: 8967
diff changeset
   241
		MakeWaterKeepingClass(tile2, GetTileOwner(tile2));
3111
1edf71aa942e (svn r3714) Add functions to turn tiles into water and shore tiles
tron
parents: 3017
diff changeset
   242
		MarkTileDirtyByTile(tile);
1edf71aa942e (svn r3714) Add functions to turn tiles into water and shore tiles
tron
parents: 3017
diff changeset
   243
		MarkTileDirtyByTile(tile2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   244
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   245
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   246
	return CommandCost(EXPENSES_CONSTRUCTION, _price.remove_ship_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   247
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   248
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   249
/** build a shiplift */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   250
static CommandCost DoBuildShiplift(TileIndex tile, DiagDirection dir, uint32 flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   251
{
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   252
	CommandCost ret;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   253
	int delta;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   254
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   255
	/* middle tile */
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   256
	ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2676
diff changeset
   257
	if (CmdFailed(ret)) return CMD_ERROR;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   258
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4434
diff changeset
   259
	delta = TileOffsByDiagDir(dir);
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   260
	/* lower tile */
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   261
	WaterClass wc_lower = IsWaterTile(tile - delta) ? GetWaterClass(tile - delta) : WATER_CLASS_CANAL;
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   262
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   263
	ret = DoCommand(tile - delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2676
diff changeset
   264
	if (CmdFailed(ret)) return CMD_ERROR;
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   265
	if (GetTileSlope(tile - delta, NULL) != SLOPE_FLAT) {
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   266
		return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   267
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   268
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   269
	/* upper tile */
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   270
	WaterClass wc_upper = IsWaterTile(tile + delta) ? GetWaterClass(tile + delta) : WATER_CLASS_CANAL;
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   271
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   272
	ret = DoCommand(tile + delta, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2676
diff changeset
   273
	if (CmdFailed(ret)) return CMD_ERROR;
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   274
	if (GetTileSlope(tile + delta, NULL) != SLOPE_FLAT) {
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   275
		return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   276
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   277
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   278
	if ((MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) ||
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   279
	    (MayHaveBridgeAbove(tile - delta) && IsBridgeAbove(tile - delta)) ||
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   280
	    (MayHaveBridgeAbove(tile + delta) && IsBridgeAbove(tile + delta))) {
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   281
		return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   282
	}
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   283
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   284
	if (flags & DC_EXEC) {
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   285
		MakeLock(tile, _current_player, dir, wc_lower, wc_upper);
3372
e9eaf986b264 (svn r4171) -Codechange: Create map accessor functions for creating ship depots and locks. Make use of them
celestar
parents: 3338
diff changeset
   286
		MarkTileDirtyByTile(tile);
e9eaf986b264 (svn r4171) -Codechange: Create map accessor functions for creating ship depots and locks. Make use of them
celestar
parents: 3338
diff changeset
   287
		MarkTileDirtyByTile(tile - delta);
e9eaf986b264 (svn r4171) -Codechange: Create map accessor functions for creating ship depots and locks. Make use of them
celestar
parents: 3338
diff changeset
   288
		MarkTileDirtyByTile(tile + delta);
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   289
		MarkCanalsAndRiversAroundDirty(tile - delta);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   290
		MarkCanalsAndRiversAroundDirty(tile + delta);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   291
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   292
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   293
	return CommandCost(EXPENSES_CONSTRUCTION, _price.clear_water * 22 >> 3);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   294
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   295
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   296
static CommandCost RemoveShiplift(TileIndex tile, uint32 flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   297
{
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4434
diff changeset
   298
	TileIndexDiff delta = TileOffsByDiagDir(GetLockDirection(tile));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   299
7766
b4a38a2be0d3 (svn r10593) -Fix [FS#1038]: one could not remove locks that were build in a (very) old version of OpenTTD.
rubidium
parents: 7762
diff changeset
   300
	if (!CheckTileOwnership(tile) && GetTileOwner(tile) != OWNER_NONE) return CMD_ERROR;
3940
f3aa8e2969d4 (svn r5084) - Add owner attribute to canals and locks. This makes them more useful in multiplayer games, as before, anyone could delete any canal or lock tile. This doesn't affect whose ships can use whose canals or locks.
peter1138
parents: 3939
diff changeset
   301
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   302
	/* make sure no vehicle is on the tile. */
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 8235
diff changeset
   303
	if (!EnsureNoVehicleOnGround(tile) || !EnsureNoVehicleOnGround(tile + delta) || !EnsureNoVehicleOnGround(tile - delta))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   304
		return CMD_ERROR;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   305
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   306
	if (flags & DC_EXEC) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   307
		DoClearSquare(tile);
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   308
		MakeWaterKeepingClass(tile + delta, GetTileOwner(tile));
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   309
		MakeWaterKeepingClass(tile - delta, GetTileOwner(tile));
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   310
		MarkTileDirtyByTile(tile - delta);
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   311
		MarkTileDirtyByTile(tile + delta);
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   312
		MarkCanalsAndRiversAroundDirty(tile - delta);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   313
		MarkCanalsAndRiversAroundDirty(tile + delta);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   314
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   315
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   316
	return CommandCost(EXPENSES_CONSTRUCTION, _price.clear_water * 2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   318
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   319
/** Builds a lock (ship-lift)
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   320
 * @param tile tile where to place the lock
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   321
 * @param flags type of operation
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   322
 * @param p1 unused
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   323
 * @param p2 unused
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   324
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   325
CommandCost CmdBuildLock(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   326
{
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   327
	DiagDirection dir = GetInclinedSlopeDirection(GetTileSlope(tile, NULL));
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   328
	if (dir == INVALID_DIAGDIR) return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
8882
f54bd3d64027 (svn r11956) -Fix [FS#1675]: Disallow building locks and docks on rapids.
peter1138
parents: 8876
diff changeset
   329
f54bd3d64027 (svn r11956) -Fix [FS#1675]: Disallow building locks and docks on rapids.
peter1138
parents: 8876
diff changeset
   330
	/* Disallow building of locks on river rapids */
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   331
	if (IsWaterTile(tile)) return_cmd_error(STR_0239_SITE_UNSUITABLE);
8882
f54bd3d64027 (svn r11956) -Fix [FS#1675]: Disallow building locks and docks on rapids.
peter1138
parents: 8876
diff changeset
   332
3157
40de8616c04c (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3111
diff changeset
   333
	return DoBuildShiplift(tile, dir, flags);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   334
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   335
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   336
/** Build a piece of canal.
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   337
 * @param tile end tile of stretch-dragging
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   338
 * @param flags type of operation
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   339
 * @param p1 start tile of stretch-dragging
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   340
 * @param p2 specifies canal (0), water (1) or river (2); last two can only be built in scenario editor
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   341
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   342
CommandCost CmdBuildCanal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   343
{
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   344
	CommandCost cost(EXPENSES_CONSTRUCTION);
1632
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   345
	int size_x, size_y;
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   346
	int x;
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   347
	int y;
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   348
	int sx, sy;
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   349
2934
3b7eef9871f8 (svn r3490) -Fix: A bunch (10) of off-by-one errors when checking if a TileIndex points to a tile on the map
tron
parents: 2737
diff changeset
   350
	if (p1 >= MapSize()) return CMD_ERROR;
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   351
6612
b511ba22a541 (svn r9105) -Fix [FS#629]: disable the ability to make flooding water with the canal build tool. In the scenario editor you can still make both canals and flooding water at height level 0.
rubidium
parents: 6585
diff changeset
   352
	/* Outside of the editor you can only build canals, not oceans */
8857
df06e88e5dbd (svn r11927) -Fix (r11926): unable to place canals in game
peter1138
parents: 8856
diff changeset
   353
	if (p2 != 0 && _game_mode != GM_EDITOR) return CMD_ERROR;
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   354
3491
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   355
	x = TileX(tile);
4c8427796c64 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3439
diff changeset
   356
	y = TileY(tile);
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   357
	sx = TileX(p1);
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   358
	sy = TileY(p1);
1632
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   359
6432
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6317
diff changeset
   360
	if (x < sx) Swap(x, sx);
8fb778a7f2d7 (svn r8841) -Fix
tron
parents: 6317
diff changeset
   361
	if (y < sy) Swap(y, sy);
1632
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   362
	size_x = (x - sx) + 1;
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   363
	size_y = (y - sy) + 1;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   364
1796
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   365
	/* Outside the editor you can only drag canals, and not areas */
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   366
	if (_game_mode != GM_EDITOR && (sx != x && sy != y)) return CMD_ERROR;
cae31916ae54 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1784
diff changeset
   367
1981
de031d2aed47 (svn r2487) Replace TILE_XY by TileXY/TileDiffXY
tron
parents: 1980
diff changeset
   368
	BEGIN_TILE_LOOP(tile, size_x, size_y, TileXY(sx, sy)) {
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   369
		CommandCost ret;
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   370
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   371
		Slope slope = GetTileSlope(tile, NULL);
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   372
		if (slope != SLOPE_FLAT && (p2 != 2 || !IsInclinedSlope(slope))) {
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   373
			return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   374
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   375
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   376
		/* can't make water of water! */
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   377
		if (IsTileType(tile, MP_WATER) && (!IsTileOwner(tile, OWNER_WATER) || p2 == 1)) continue;
1632
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   378
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   379
		ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   380
		if (CmdFailed(ret)) return ret;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   381
		cost.AddCost(ret);
3183
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   382
3189
1af302c5abd0 (svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
tron
parents: 3183
diff changeset
   383
		if (flags & DC_EXEC) {
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   384
			if (TileHeight(tile) == 0 && p2 == 1) {
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   385
				MakeWater(tile);
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   386
			} else if (p2 == 2) {
8864
0082e49e8351 (svn r11934) -Codechange: add persistent random data for river and canal tiles.
peter1138
parents: 8857
diff changeset
   387
				MakeRiver(tile, Random());
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   388
			} else {
8864
0082e49e8351 (svn r11934) -Codechange: add persistent random data for river and canal tiles.
peter1138
parents: 8857
diff changeset
   389
				MakeCanal(tile, _current_player, Random());
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   390
			}
3189
1af302c5abd0 (svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
tron
parents: 3183
diff changeset
   391
			MarkTileDirtyByTile(tile);
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   392
			MarkCanalsAndRiversAroundDirty(tile);
3189
1af302c5abd0 (svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
tron
parents: 3183
diff changeset
   393
		}
3183
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   394
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   395
		cost.AddCost(_price.clear_water);
1632
c4ae19bfebf7 (svn r2136) - Fix: [ 1174313 ] terrain hotkeys nonfunctional in scenario editor (D,Q,W,E,R,T,Y,U fltr)
Darkvater
parents: 1605
diff changeset
   396
	} END_TILE_LOOP(tile, size_x, size_y, 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   397
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   398
	if (cost.GetCost() == 0) {
3183
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   399
		return_cmd_error(STR_1007_ALREADY_BUILT);
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   400
	} else {
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   401
		return cost;
cf71bd234ebd (svn r3829) Reduce the use of _error_message by directly returning error codes instead of using this global variable
tron
parents: 3177
diff changeset
   402
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   403
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   404
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7402
diff changeset
   405
static CommandCost ClearTile_Water(TileIndex tile, byte flags)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
   406
{
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   407
	switch (GetWaterTileType(tile)) {
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   408
		case WATER_TILE_CLEAR:
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   409
			if (flags & DC_NO_WATER) return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   410
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   411
			/* Make sure it's not an edge tile. */
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8444
diff changeset
   412
			if (!IsInsideMM(TileX(tile), 1, MapMaxX() - 1) ||
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8444
diff changeset
   413
					!IsInsideMM(TileY(tile), 1, MapMaxY() - 1)) {
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   414
				return_cmd_error(STR_0002_TOO_CLOSE_TO_EDGE_OF_MAP);
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   415
			}
3017
915fae59d5e0 (svn r3597) Miscellaneous (I like that word) changes: Fix some indentation, add consts, reduce indentation level by short-circuit logic, convert if cascades to switch, whitespace, bracing, plus some minor stuff
tron
parents: 2989
diff changeset
   416
8005
9f7a95e84682 (svn r11024) -Fix [FS#1173]: give a more correct error when building some things on tile 0; "Can't build on water" or "Too close to the edge" instead of "Vehicle in the way". Patch by SmatZ.
rubidium
parents: 8003
diff changeset
   417
			/* Make sure no vehicle is on the tile */
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 8235
diff changeset
   418
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
8005
9f7a95e84682 (svn r11024) -Fix [FS#1173]: give a more correct error when building some things on tile 0; "Can't build on water" or "Too close to the edge" instead of "Vehicle in the way". Patch by SmatZ.
rubidium
parents: 8003
diff changeset
   419
7766
b4a38a2be0d3 (svn r10593) -Fix [FS#1038]: one could not remove locks that were build in a (very) old version of OpenTTD.
rubidium
parents: 7762
diff changeset
   420
			if (GetTileOwner(tile) != OWNER_WATER && GetTileOwner(tile) != OWNER_NONE && !CheckTileOwnership(tile)) return CMD_ERROR;
3940
f3aa8e2969d4 (svn r5084) - Add owner attribute to canals and locks. This makes them more useful in multiplayer games, as before, anyone could delete any canal or lock tile. This doesn't affect whose ships can use whose canals or locks.
peter1138
parents: 3939
diff changeset
   421
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   422
			if (flags & DC_EXEC) {
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   423
				DoClearSquare(tile);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   424
				MarkCanalsAndRiversAroundDirty(tile);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   425
			}
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   426
			return CommandCost(EXPENSES_CONSTRUCTION, _price.clear_water);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   427
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   428
		case WATER_TILE_COAST: {
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3491
diff changeset
   429
			Slope slope = GetTileSlope(tile, NULL);
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   430
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   431
			/* Make sure no vehicle is on the tile */
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 8235
diff changeset
   432
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   433
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   434
			if (flags & DC_EXEC) {
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   435
				DoClearSquare(tile);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   436
				MarkCanalsAndRiversAroundDirty(tile);
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   437
			}
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   438
			if (IsSlopeWithOneCornerRaised(slope)) {
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   439
				return CommandCost(EXPENSES_CONSTRUCTION, _price.clear_water);
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   440
			} else {
8726
5ae45b46506b (svn r11793) -Codechange: pass the expense type via the CommandCost instead of a global variable. Patch by Noldo (FS#1114).
rubidium
parents: 8720
diff changeset
   441
				return CommandCost(EXPENSES_CONSTRUCTION, _price.clear_roughland);
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   442
			}
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   443
		}
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   444
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   445
		case WATER_TILE_LOCK: {
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   446
			static const TileIndexDiffC _shiplift_tomiddle_offs[] = {
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   447
				{ 0,  0}, {0,  0}, { 0, 0}, {0,  0}, // middle
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   448
				{-1,  0}, {0,  1}, { 1, 0}, {0, -1}, // lower
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   449
				{ 1,  0}, {0, -1}, {-1, 0}, {0,  1}, // upper
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   450
			};
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   451
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   452
			if (flags & DC_AUTO) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   453
			if (_current_player == OWNER_WATER) return CMD_ERROR;
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   454
			/* move to the middle tile.. */
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   455
			return RemoveShiplift(tile + ToTileIndexDiff(_shiplift_tomiddle_offs[GetSection(tile)]), flags);
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   456
		}
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   457
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   458
		case WATER_TILE_DEPOT:
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   459
			if (flags & DC_AUTO) return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   460
			return RemoveShipDepot(tile, flags);
3439
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   461
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   462
		default:
af9ed14f232c (svn r4269) We don't use GNU indentation style
tron
parents: 3436
diff changeset
   463
			NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   464
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   465
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   466
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   467
/**
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   468
 * return true if a tile is a water tile wrt. a certain direction.
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   469
 *
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   470
 * @param tile The tile of interest.
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   471
 * @param from The direction of interest.
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   472
 * @return true iff the tile is water in the view of 'from'.
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   473
 *
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   474
 */
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   475
static bool IsWateredTile(TileIndex tile, Direction from)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   476
{
1214
33e07bbb7779 (svn r1718) Use the enum TileType as parameter/return type for [GS]etTileType() instead of plain int.
tron
parents: 1209
diff changeset
   477
	switch (GetTileType(tile)) {
3977
edb5b94e2094 (svn r5155) - Remove the bridge branch merge (revision r5070)
tron
parents: 3940
diff changeset
   478
		case MP_WATER:
4087
5ae6c880d66c (svn r5403) - Feature: Allow building canals at sea-level, using ctrl to toggle canal or plain water tile. This allows building of non-raisable sea-level water ways (useful in multiplayer) and dikes for low-level areas.
peter1138
parents: 4077
diff changeset
   479
			if (!IsCoast(tile)) return true;
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   480
			switch (GetTileSlope(tile, NULL)) {
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   481
				case SLOPE_W: return (from == DIR_SE) || (from == DIR_E) || (from == DIR_NE);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   482
				case SLOPE_S: return (from == DIR_NE) || (from == DIR_N) || (from == DIR_NW);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   483
				case SLOPE_E: return (from == DIR_NW) || (from == DIR_W) || (from == DIR_SW);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   484
				case SLOPE_N: return (from == DIR_SW) || (from == DIR_S) || (from == DIR_SE);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   485
				default: return false;
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   486
			}
3977
edb5b94e2094 (svn r5155) - Remove the bridge branch merge (revision r5070)
tron
parents: 3940
diff changeset
   487
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   488
		case MP_RAILWAY:
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   489
			if (GetRailGroundType(tile) == RAIL_GROUND_WATER) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   490
				assert(IsPlainRailTile(tile));
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   491
				switch (GetTileSlope(tile, NULL)) {
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   492
					case SLOPE_W: return (from == DIR_SE) || (from == DIR_E) || (from == DIR_NE);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   493
					case SLOPE_S: return (from == DIR_NE) || (from == DIR_N) || (from == DIR_NW);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   494
					case SLOPE_E: return (from == DIR_NW) || (from == DIR_W) || (from == DIR_SW);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   495
					case SLOPE_N: return (from == DIR_SW) || (from == DIR_S) || (from == DIR_SE);
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   496
					default: return false;
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   497
				}
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   498
			}
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   499
			return false;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   500
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   501
		case MP_STATION:  return IsOilRig(tile) || (IsDock(tile) && GetTileSlope(tile, NULL) == SLOPE_FLAT) || IsBuoy(tile);
8003
bd88e365c18a (svn r11022) -Fix: the canal border determination did not take oil rigs into consideration.
rubidium
parents: 7993
diff changeset
   502
		case MP_INDUSTRY: return (GetIndustrySpec(GetIndustryType(tile))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
bd88e365c18a (svn r11022) -Fix: the canal border determination did not take oil rigs into consideration.
rubidium
parents: 7993
diff changeset
   503
		default:          return false;
1048
edfc783f241d (svn r1549) Clean up some functions:
tron
parents: 1041
diff changeset
   504
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   505
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   506
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   507
static void DrawWaterEdges(SpriteID base, TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   508
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   509
	uint wa;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   510
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   511
	/* determine the edges around with water. */
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   512
	wa  = IsWateredTile(TILE_ADDXY(tile, -1,  0), DIR_SW) << 0;
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   513
	wa += IsWateredTile(TILE_ADDXY(tile,  0,  1), DIR_NW) << 1;
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   514
	wa += IsWateredTile(TILE_ADDXY(tile,  1,  0), DIR_NE) << 2;
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   515
	wa += IsWateredTile(TILE_ADDXY(tile,  0, -1), DIR_SE) << 3;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   516
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   517
	if (!(wa & 1)) DrawGroundSprite(base,     PAL_NONE);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   518
	if (!(wa & 2)) DrawGroundSprite(base + 1, PAL_NONE);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   519
	if (!(wa & 4)) DrawGroundSprite(base + 2, PAL_NONE);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   520
	if (!(wa & 8)) DrawGroundSprite(base + 3, PAL_NONE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   521
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   522
	/* right corner */
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   523
	switch (wa & 0x03) {
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   524
		case 0: DrawGroundSprite(base + 4, PAL_NONE); break;
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   525
		case 3: if (!IsWateredTile(TILE_ADDXY(tile, -1, 1), DIR_W)) DrawGroundSprite(base + 8, PAL_NONE); break;
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   526
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   527
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   528
	/* bottom corner */
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   529
	switch (wa & 0x06) {
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   530
		case 0: DrawGroundSprite(base + 5, PAL_NONE); break;
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   531
		case 6: if (!IsWateredTile(TILE_ADDXY(tile, 1, 1), DIR_N)) DrawGroundSprite(base + 9, PAL_NONE); break;
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   532
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   533
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   534
	/* left corner */
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   535
	switch (wa & 0x0C) {
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   536
		case  0: DrawGroundSprite(base + 6, PAL_NONE); break;
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   537
		case 12: if (!IsWateredTile(TILE_ADDXY(tile, 1, -1), DIR_E)) DrawGroundSprite(base + 10, PAL_NONE); break;
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   538
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   539
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
   540
	/* upper corner */
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   541
	switch (wa & 0x09) {
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   542
		case 0: DrawGroundSprite(base + 7, PAL_NONE); break;
8937
40f1d2e4c833 (svn r12011) -Fix [FS#1701]: Do not consider one-corner-raised-shores to be watered tiles from all sides.
frosch
parents: 8926
diff changeset
   543
		case 9: if (!IsWateredTile(TILE_ADDXY(tile, -1, -1), DIR_S)) DrawGroundSprite(base + 11, PAL_NONE); break;
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
   544
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   545
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   546
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   547
/** Draw a plain sea water tile with no edges */
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   548
static void DrawSeaWater(TileIndex tile)
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   549
{
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   550
	DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   551
}
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   552
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   553
/** draw a canal styled water tile with dikes around */
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   554
static void DrawCanalWater(TileIndex tile)
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   555
{
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   556
	DrawGroundSprite(SPR_FLAT_WATER_TILE, PAL_NONE);
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   557
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   558
	/* Test for custom graphics, else use the default */
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   559
	SpriteID dikes_base = GetCanalSprite(CF_DIKES, tile);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   560
	if (dikes_base == 0) dikes_base = SPR_CANAL_DIKES_BASE;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   561
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   562
	DrawWaterEdges(dikes_base, tile);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   563
}
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   564
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6507
diff changeset
   565
struct LocksDrawTileStruct {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   566
	int8 delta_x, delta_y, delta_z;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   567
	byte width, height, depth;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   568
	SpriteID image;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6507
diff changeset
   569
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   570
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   571
#include "table/water_land.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   572
2436
177cb6a8339f (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2261
diff changeset
   573
static void DrawWaterStuff(const TileInfo *ti, const WaterDrawTileStruct *wdts,
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   574
	SpriteID palette, uint base, bool draw_ground
1399
4503bd2bfb82 (svn r1903) Replace some casts and macro magic with proper typing, similar to r1902
tron
parents: 1363
diff changeset
   575
)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
{
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   577
	SpriteID image;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   578
	SpriteID water_base = GetCanalSprite(CF_WATERSLOPE, ti->tile);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   579
	SpriteID locks_base = GetCanalSprite(CF_LOCKS, ti->tile);
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   580
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   581
	/* If no custom graphics, use defaults */
8378
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8345
diff changeset
   582
	if (water_base == 0) water_base = SPR_CANALS_BASE;
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   583
	if (locks_base == 0) {
8378
9f849e5763e2 (svn r11433) -Fix: starting OpenTTD with DOS files made it look weird out of the box.
rubidium
parents: 8345
diff changeset
   584
		locks_base = SPR_SHIPLIFT_BASE;
7079
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   585
	} else {
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   586
		/* If using custom graphics, ignore the variation on height */
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   587
		base = 0;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   588
	}
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   589
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   590
	image = wdts++->image;
35743c461482 (svn r9797) -Feature: [NewGRF] Add action 1, 2 and 3 support for canals.
peter1138
parents: 6987
diff changeset
   591
	if (image < 4) image += water_base;
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   592
	if (draw_ground) DrawGroundSprite(image, PAL_NONE);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   593
1399
4503bd2bfb82 (svn r1903) Replace some casts and macro magic with proper typing, similar to r1902
tron
parents: 1363
diff changeset
   594
	for (; wdts->delta_x != 0x80; wdts++) {
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7766
diff changeset
   595
		AddSortableSpriteToDraw(wdts->image + base + ((wdts->image < 24) ? locks_base : 0), palette,
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5838
diff changeset
   596
			ti->x + wdts->delta_x, ti->y + wdts->delta_y,
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5838
diff changeset
   597
			wdts->width, wdts->height,
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7766
diff changeset
   598
			wdts->unk, ti->z + wdts->delta_z,
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8293
diff changeset
   599
			IsTransparencySet(TO_BUILDINGS));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   600
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   601
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   602
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   603
static void DrawRiverWater(const TileInfo *ti)
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   604
{
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   605
	SpriteID image = SPR_FLAT_WATER_TILE;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   606
	SpriteID edges_base = GetCanalSprite(CF_RIVER_EDGE, ti->tile);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   607
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   608
	if (ti->tileh != SLOPE_FLAT) {
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   609
		image = GetCanalSprite(CF_RIVER_SLOPE, ti->tile);
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   610
		if (image == 0) {
8926
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   611
			switch (ti->tileh) {
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   612
				case SLOPE_NW: image = SPR_WATER_SLOPE_Y_DOWN; break;
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   613
				case SLOPE_SW: image = SPR_WATER_SLOPE_X_UP;   break;
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   614
				case SLOPE_SE: image = SPR_WATER_SLOPE_Y_UP;   break;
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   615
				case SLOPE_NE: image = SPR_WATER_SLOPE_X_DOWN; break;
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   616
				default:       image = SPR_FLAT_WATER_TILE;    break;
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   617
			}
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   618
		} else {
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   619
			switch (ti->tileh) {
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   620
				default: NOT_REACHED();
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   621
				case SLOPE_SE:             edges_base += 12; break;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   622
				case SLOPE_NE: image += 1; edges_base += 24; break;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   623
				case SLOPE_SW: image += 2; edges_base += 36; break;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   624
				case SLOPE_NW: image += 3; edges_base += 48; break;
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   625
			}
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   626
		}
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   627
	}
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   628
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   629
	DrawGroundSprite(image, PAL_NONE);
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   630
8926
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   631
	/* Draw river edges if available. */
5bf75fec316f (svn r12000) -Fix (r11926): If no river NewGRF is loaded, use sloped water from locks.
frosch
parents: 8910
diff changeset
   632
	if (edges_base > 48) DrawWaterEdges(edges_base, ti->tile);
8856
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   633
}
7f8b5c11bea6 (svn r11926) -Feature: Rivers. Graphics must be provided by NewGRF else rivers are drawn as canals. Rivers can currently only be placed with-in the scenario editor.
peter1138
parents: 8846
diff changeset
   634
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   635
void DrawShoreTile(Slope tileh)
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   636
{
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   637
	/* Converts the enum Slope into an offset based on SPR_SHORE_BASE.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   638
	 * This allows to calculate the proper sprite to display for this Slope */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   639
	static const byte tileh_to_shoresprite[32] = {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   640
		0, 1, 2, 3, 4, 16, 6, 7, 8, 9, 17, 11, 12, 13, 14, 0,
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   641
		0, 0, 0, 0, 0,  0, 0, 0, 0, 0,  0,  5,  0, 10, 15, 0,
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   642
	};
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   643
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   644
	assert(!IsHalftileSlope(tileh)); // Halftile slopes need to get handled earlier.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   645
	assert(tileh != SLOPE_FLAT);     // Shore is never flat
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   646
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   647
	assert((tileh != SLOPE_EW) && (tileh != SLOPE_NS)); // No suitable sprites for current flooding behaviour
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   648
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   649
	DrawGroundSprite(SPR_SHORE_BASE + tileh_to_shoresprite[tileh], PAL_NONE);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   650
}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   651
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   652
void DrawWaterClassGround(const TileInfo *ti) {
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   653
	switch (GetWaterClass(ti->tile)) {
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   654
		case WATER_CLASS_SEA:   DrawSeaWater(ti->tile); break;
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   655
		case WATER_CLASS_CANAL: DrawCanalWater(ti->tile); break;
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   656
		case WATER_CLASS_RIVER: DrawRiverWater(ti); break;
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   657
	}
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   658
}
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   659
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   660
static void DrawTile_Water(TileInfo *ti)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   661
{
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   662
	switch (GetWaterTileType(ti->tile)) {
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   663
		case WATER_TILE_CLEAR:
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   664
			DrawWaterClassGround(ti);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   665
			DrawBridgeMiddle(ti);
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   666
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   667
8660
498f2a298b04 (svn r11726) -Feature[newGRF]: Extend the Action 5, feature 0D usage. Patch by BigBB
belugas
parents: 8653
diff changeset
   668
		case WATER_TILE_COAST: {
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   669
			DrawShoreTile(ti->tileh);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5210
diff changeset
   670
			DrawBridgeMiddle(ti);
8660
498f2a298b04 (svn r11726) -Feature[newGRF]: Extend the Action 5, feature 0D usage. Patch by BigBB
belugas
parents: 8653
diff changeset
   671
		} break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   672
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   673
		case WATER_TILE_LOCK: {
3425
b972214fde4f (svn r4252) -Codechange: Make more use of map accessors. water_cmd is now map access free
celestar
parents: 3423
diff changeset
   674
			const WaterDrawTileStruct *t = _shiplift_display_seq[GetSection(ti->tile)];
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   675
			DrawWaterStuff(ti, t, 0, ti->z > t[3].delta_y ? 24 : 0, true);
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   676
		} break;
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   677
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   678
		case WATER_TILE_DEPOT:
8992
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   679
			DrawWaterClassGround(ti);
4fa931bf2417 (svn r12071) -Feature(ette): Draw river- and canal-edges under docks and shipdepots.
frosch
parents: 8991
diff changeset
   680
			DrawWaterStuff(ti, _shipdepot_display_seq[GetSection(ti->tile)], PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)), 0, false);
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   681
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   682
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   683
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   684
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   685
void DrawShipDepotSprite(int x, int y, int image)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   686
{
1399
4503bd2bfb82 (svn r1903) Replace some casts and macro magic with proper typing, similar to r1902
tron
parents: 1363
diff changeset
   687
	const WaterDrawTileStruct *wdts = _shipdepot_display_seq[image];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   688
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5838
diff changeset
   689
	DrawSprite(wdts++->image, PAL_NONE, x, y);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   690
1399
4503bd2bfb82 (svn r1903) Replace some casts and macro magic with proper typing, similar to r1902
tron
parents: 1363
diff changeset
   691
	for (; wdts->delta_x != 0x80; wdts++) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   692
		Point pt = RemapCoords(wdts->delta_x, wdts->delta_y, wdts->delta_z);
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5838
diff changeset
   693
		DrawSprite(wdts->image, PLAYER_SPRITE_COLOR(_local_player), x + pt.x, y + pt.y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   694
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   695
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   696
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   697
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4171
diff changeset
   698
static uint GetSlopeZ_Water(TileIndex tile, uint x, uint y)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   699
{
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4171
diff changeset
   700
	uint z;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   701
	Slope tileh = GetTileSlope(tile, &z);
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4171
diff changeset
   702
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4171
diff changeset
   703
	return z + GetPartialZ(x & 0xF, y & 0xF, tileh);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   704
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   705
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7829
diff changeset
   706
static Foundation GetFoundation_Water(TileIndex tile, Slope tileh)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   707
{
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7829
diff changeset
   708
	return FOUNDATION_NONE;
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 0
diff changeset
   709
}
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 0
diff changeset
   710
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
   711
static void GetAcceptedCargo_Water(TileIndex tile, AcceptedCargo ac)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   712
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   713
	/* not used */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   714
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   715
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
   716
static void GetTileDesc_Water(TileIndex tile, TileDesc *td)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   717
{
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   718
	switch (GetWaterTileType(tile)) {
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   719
		case WATER_TILE_CLEAR:
8235
fc75e5ad02b6 (svn r11276) -Codechange: be more consistent with naming of some accessors.
rubidium
parents: 8227
diff changeset
   720
			if (!IsCanal(tile)) {
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   721
				td->str = STR_3804_WATER;
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   722
			} else {
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   723
				td->str = STR_LANDINFO_CANAL;
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   724
			}
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   725
			break;
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   726
		case WATER_TILE_COAST: td->str = STR_3805_COAST_OR_RIVERBANK; break;
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   727
		case WATER_TILE_LOCK : td->str = STR_LANDINFO_LOCK; break;
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
   728
		case WATER_TILE_DEPOT: td->str = STR_3806_SHIP_DEPOT; break;
3402
0b72e324d300 (svn r4212) -Codechange: Add and make use of an accessor that retrieves the type of a water tile. Add an enum describing the different water tiles
celestar
parents: 3373
diff changeset
   729
		default: assert(0); break;
2951
2db3adee7736 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   730
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   731
1901
fb05044cf5c3 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
   732
	td->owner = GetTileOwner(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   733
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   734
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
   735
static void AnimateTile_Water(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   736
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   737
	/* not used */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   738
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   739
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   740
6191
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   741
/**
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   742
 * Finds a vehicle to flood.
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   743
 * It does not find vehicles that are already crashed on bridges, i.e. flooded.
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   744
 * @param tile the tile where to find a vehicle to flood
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   745
 * @return a vehicle too flood or NULL when there is no vehicle too flood.
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   746
 */
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   747
static Vehicle *FindFloodableVehicleOnTile(TileIndex tile)
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   748
{
7402
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   749
	if (IsTileType(tile, MP_STATION) && IsAirport(tile)) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   750
		const Station *st = GetStationByTile(tile);
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   751
		const AirportFTAClass *airport = st->Airport();
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   752
		for (uint x = 0; x < airport->size_x; x++) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   753
			for (uint y = 0; y < airport->size_y; y++) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   754
				tile = TILE_ADDXY(st->airport_tile, x, y);
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   755
				Vehicle *v = FindVehicleOnTileZ(tile, 1 + airport->delta_z);
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   756
				if (v != NULL && (v->vehstatus & VS_CRASHED) == 0) return v;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   757
			}
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   758
		}
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   759
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   760
		/* No vehicle could be flooded on this airport anymore */
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   761
		return NULL;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   762
	}
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   763
8510
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   764
	/* if non-uniform stations are disabled, flood some train in this train station (if there is any) */
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   765
	if (!_patches.nonuniform_stations && IsTileType(tile, MP_STATION) && GetStationType(tile) == STATION_RAIL) {
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   766
		const Station *st = GetStationByTile(tile);
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   767
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   768
		BEGIN_TILE_LOOP(t, st->trainst_w, st->trainst_h, st->train_tile)
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   769
			if (st->TileBelongsToRailStation(t)) {
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   770
				Vehicle *v = FindVehicleOnTileZ(t, 0);
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   771
				if (v != NULL && (v->vehstatus & VS_CRASHED) == 0) return v;
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   772
			}
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   773
		END_TILE_LOOP(t, st->trainst_w, st->trainst_h, st->train_tile)
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   774
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   775
		return NULL;
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   776
	}
17bda703ae17 (svn r11574) -Fix: flood train stations when there are no trains on border tiles too (when non-uniform stations are OFF)
smatz
parents: 8473
diff changeset
   777
6191
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   778
	if (!IsBridgeTile(tile)) return FindVehicleOnTileZ(tile, 0);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   779
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   780
	TileIndex end = GetOtherBridgeEnd(tile);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   781
	byte z = GetBridgeHeight(tile);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   782
	Vehicle *v;
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   783
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   784
	/* check the start tile first since as this is closest to the water */
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   785
	v = FindVehicleOnTileZ(tile, z);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   786
	if (v != NULL && (v->vehstatus & VS_CRASHED) == 0) return v;
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   787
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   788
	/* check a vehicle in between both bridge heads */
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   789
	v = FindVehicleBetween(tile, end, z, true);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   790
	if (v != NULL) return v;
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   791
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   792
	/* check the end tile last to give fleeing vehicles a chance to escape */
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   793
	v = FindVehicleOnTileZ(end, z);
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   794
	return (v != NULL && (v->vehstatus & VS_CRASHED) == 0) ? v : NULL;
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   795
}
12d69f54e920 (svn r8593) -Fix (FS#564): bridges do not get destroyed when the bridge head gets flooded and there is a vehicle on the bridge. Original patch by KeeperofTheSoul.
rubidium
parents: 6156
diff changeset
   796
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   797
static void FloodVehicle(Vehicle *v)
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   798
{
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   799
	if (!(v->vehstatus & VS_CRASHED)) {
168
79f9ed5b23e6 (svn r169) -Fix: move around sort-widgets a bit so it looks more natural
darkvater
parents: 164
diff changeset
   800
		uint16 pass = 0;
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   801
7402
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   802
		if (v->type == VEH_TRAIN || v->type == VEH_ROAD || v->type == VEH_AIRCRAFT) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   803
			if (v->type == VEH_AIRCRAFT) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   804
				/* Crashing aircraft are always at z_pos == 1, never on z_pos == 0,
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   805
				 * because that's always the shadow. Except for the heliport, because
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   806
				 * that station has a big z_offset for the aircraft. */
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   807
				if (!IsTileType(v->tile, MP_STATION) || !IsAirport(v->tile) || GetTileMaxZ(v->tile) != 0) return;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   808
				const Station *st = GetStationByTile(v->tile);
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   809
				const AirportFTAClass *airport = st->Airport();
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   810
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   811
				if (v->z_pos != airport->delta_z + 1) return;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   812
			}
4171
3fadda3afe70 (svn r5609) CodeChange : Apply coding style
belugas
parents: 4169
diff changeset
   813
			Vehicle *u;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   814
7993
76b0eb3e19c9 (svn r11011) -Fix [FS#1129]: GetFirstVehicleInChain did change the game state while being marked const.
rubidium
parents: 7990
diff changeset
   815
			if (v->type != VEH_AIRCRAFT) v = v->First();
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   816
			u = v;
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   817
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7179
diff changeset
   818
			/* crash all wagons, and count passengers */
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   819
			BEGIN_ENUM_WAGONS(v)
7506
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7446
diff changeset
   820
				if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) pass += v->cargo.Count();
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   821
				v->vehstatus |= VS_CRASHED;
8813
6d054db96ede (svn r11882) -Codechange: introduce MarkSingleVehicleDirty() and simplify the code at some places
smatz
parents: 8802
diff changeset
   822
				MarkSingleVehicleDirty(v);
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   823
			END_ENUM_WAGONS(v)
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   824
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   825
			v = u;
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7179
diff changeset
   826
7402
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   827
			switch (v->type) {
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   828
				default: NOT_REACHED();
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   829
				case VEH_TRAIN:
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   830
					if (IsFrontEngine(v)) pass += 4; // driver
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   831
					v->u.rail.crash_anim_pos = 4000; // max 4440, disappear pretty fast
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   832
					break;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   833
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   834
				case VEH_ROAD:
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   835
					if (IsRoadVehFront(v)) pass += 1; // driver
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   836
					v->u.road.crashed_ctr = 2000; // max 2220, disappear pretty fast
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   837
					break;
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   838
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   839
				case VEH_AIRCRAFT:
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   840
					pass += 2; // driver
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   841
					v->u.air.crashed_counter = 9000; // max 10000, disappear pretty fast
94575d2b8b02 (svn r10155) -Fix [FS#601]: Airports didn't flood when there are aircraft on the airport.
rubidium
parents: 7353
diff changeset
   842
					break;
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7179
diff changeset
   843
			}
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7179
diff changeset
   844
588
1b60458bdc29 (svn r1009) -Feature: per-station vehicle lists
tron
parents: 541
diff changeset
   845
			RebuildVehicleLists();
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   846
		} else {
168
79f9ed5b23e6 (svn r169) -Fix: move around sort-widgets a bit so it looks more natural
darkvater
parents: 164
diff changeset
   847
			return;
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   848
		}
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   849
8846
f3e877a92e2b (svn r11916) -Codechange: use enums from VehicleViewWindowWidgets instead of constants
smatz
parents: 8828
diff changeset
   850
		InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   851
		InvalidateWindow(WC_VEHICLE_DEPOT, v->tile);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
   852
534
17ab2f22ff74 (svn r901) Small step in the process to clean up the DPARAM mess:
tron
parents: 507
diff changeset
   853
		SetDParam(0, pass);
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   854
		AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED,
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6949
diff changeset
   855
			NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   856
			v->index,
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   857
			0);
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   858
		CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   859
		SndPlayVehicleFx(SND_12_EXPLOSION, v);
714
e3b9eda8dc45 (svn r1166) Fix: [ 1040119 ] Flooded wagons in depots don't keep constantly exploding any more
dominik
parents: 679
diff changeset
   860
	}
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   861
}
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 43
diff changeset
   862
8227
9529f32a20fa (svn r11266) -Documentation: Add a few comments. Parts of BigBB's work on shores
belugas
parents: 8041
diff changeset
   863
/**
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   864
 * Returns the behaviour of a tile during flooding.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   865
 *
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   866
 * @return Behaviour of the tile
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   867
 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   868
static FloodingBehaviour GetFloodingBehaviour(TileIndex tile)
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   869
{
8993
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   870
	/* FLOOD_ACTIVE:  'single-corner-raised'-coast, sea, sea-shipdepots, sea-buoys, sea-docks (water part), rail with flooded halftile
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   871
	 * FLOOD_DRYUP:   coast with more than one corner raised, coast with rail-track, coast with trees
8993
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   872
	 * FLOOD_PASSIVE: oilrig, water-industries
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   873
	 * FLOOD_NONE:    canals, rivers, everything else
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   874
	 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   875
	switch (GetTileType(tile)) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   876
		case MP_WATER:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   877
			if (IsCoast(tile)) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   878
				Slope tileh = GetTileSlope(tile, NULL);
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
   879
				return (IsSlopeWithOneCornerRaised(tileh) ? FLOOD_ACTIVE : FLOOD_DRYUP);
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   880
			} else {
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
   881
				return (GetWaterClass(tile) == WATER_CLASS_SEA) ? FLOOD_ACTIVE : FLOOD_NONE;
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   882
			}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   883
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   884
		case MP_RAILWAY:
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   885
			if (GetRailGroundType(tile) == RAIL_GROUND_WATER) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   886
				return (IsSlopeWithOneCornerRaised(GetTileSlope(tile, NULL)) ? FLOOD_ACTIVE : FLOOD_DRYUP);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   887
			}
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   888
			return FLOOD_NONE;
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   889
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   890
		case MP_TREES:
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   891
			return (GetTreeGround(tile) == TREE_GROUND_SHORE ? FLOOD_DRYUP : FLOOD_NONE);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   892
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   893
		case MP_STATION:
8993
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   894
			if (IsBuoy(tile) || (IsDock(tile) && GetTileSlope(tile, NULL) == SLOPE_FLAT)) {
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   895
				return (GetWaterClass(tile) == WATER_CLASS_SEA ? FLOOD_ACTIVE : FLOOD_NONE);
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   896
			}
0794cc59940d (svn r12072) -Fix: Make docks at sea flood neighboured tiles.
frosch
parents: 8992
diff changeset
   897
			return (IsOilRig(tile) ? FLOOD_PASSIVE : FLOOD_NONE);
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   898
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   899
		case MP_INDUSTRY:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   900
			return ((GetIndustrySpec(GetIndustryType(tile))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0 ? FLOOD_PASSIVE : FLOOD_NONE);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   901
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   902
		default:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   903
			return FLOOD_NONE;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   904
	}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   905
}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   906
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   907
/**
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   908
 * Floods a tile.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   909
 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   910
static void DoFloodTile(TileIndex target)
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   911
{
9180
f39e3460f0ab (svn r12350) -Fix [FS#1836](r11947): do not try ti flood water tile (performance increase)
glx
parents: 9112
diff changeset
   912
	assert(!IsTileType(target, MP_WATER));
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   913
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   914
	bool flooded = false; // Will be set to true if something is changed.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   915
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   916
	_current_player = OWNER_WATER;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   917
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   918
	Slope tileh = GetTileSlope(target, NULL);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   919
	if (tileh != SLOPE_FLAT) {
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   920
		/* make coast.. */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   921
		switch (GetTileType(target)) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   922
			case MP_RAILWAY: {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   923
				if (!IsPlainRailTile(target)) break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   924
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   925
				flooded = FloodHalftile(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   926
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   927
				Vehicle *v = FindFloodableVehicleOnTile(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   928
				if (v != NULL) FloodVehicle(v);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   929
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   930
				break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   931
			}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   932
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   933
			case MP_TREES:
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   934
				if (!IsSlopeWithOneCornerRaised(tileh)) {
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   935
					SetTreeGroundDensity(target, TREE_GROUND_SHORE, 3);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   936
					MarkTileDirtyByTile(target);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   937
					flooded = true;
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   938
					break;
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   939
				}
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
   940
			/* FALL THROUGH */
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   941
			case MP_CLEAR:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   942
				if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   943
					MakeShore(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   944
					MarkTileDirtyByTile(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   945
					flooded = true;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   946
				}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   947
				break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   948
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   949
			default:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   950
				break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   951
		}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   952
	} else {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   953
		/* Flood vehicles */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   954
		Vehicle *v = FindFloodableVehicleOnTile(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   955
		if (v != NULL) FloodVehicle(v);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   956
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   957
		/* flood flat tile */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   958
		if (CmdSucceeded(DoCommand(target, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   959
			MakeWater(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   960
			MarkTileDirtyByTile(target);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   961
			flooded = true;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   962
		}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   963
	}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   964
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   965
	if (flooded) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   966
		/* Mark surrounding canal tiles dirty too to avoid glitches */
8939
9d51d72e7e3d (svn r12013) -Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases.
frosch
parents: 8937
diff changeset
   967
		MarkCanalsAndRiversAroundDirty(target);
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   968
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   969
		/* update signals if needed */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   970
		UpdateSignalsInBuffer();
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   971
	}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   972
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   973
	_current_player = OWNER_NONE;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   974
}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   975
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   976
/**
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   977
 * Drys a tile up.
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   978
 */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   979
static void DoDryUp(TileIndex tile)
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   980
{
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   981
	_current_player = OWNER_WATER;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
   982
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   983
	switch (GetTileType(tile)) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   984
		case MP_RAILWAY:
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   985
			assert(IsPlainRailTile(tile));
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   986
			assert(GetRailGroundType(tile) == RAIL_GROUND_WATER);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   987
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   988
			RailGroundType new_ground;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   989
			switch (GetTrackBits(tile)) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   990
				case TRACK_BIT_UPPER: new_ground = RAIL_GROUND_FENCE_HORIZ1; break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   991
				case TRACK_BIT_LOWER: new_ground = RAIL_GROUND_FENCE_HORIZ2; break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   992
				case TRACK_BIT_LEFT:  new_ground = RAIL_GROUND_FENCE_VERT1;  break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   993
				case TRACK_BIT_RIGHT: new_ground = RAIL_GROUND_FENCE_VERT2;  break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   994
				default: NOT_REACHED();
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   995
			}
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   996
			SetRailGroundType(tile, new_ground);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   997
			MarkTileDirtyByTile(tile);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   998
			break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
   999
8955
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
  1000
		case MP_TREES:
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
  1001
			SetTreeGroundDensity(tile, TREE_GROUND_GRASS, 3);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
  1002
			MarkTileDirtyByTile(tile);
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
  1003
			break;
8d6bb31af11b (svn r12029) -Feature: Allow trees on shore.
frosch
parents: 8939
diff changeset
  1004
8910
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1005
		case MP_WATER:
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1006
			assert(IsCoast(tile));
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1007
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1008
			if (CmdSucceeded(DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR))) {
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1009
				MakeClear(tile, CLEAR_GRASS, 3);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1010
				MarkTileDirtyByTile(tile);
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1011
			}
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1012
			break;
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1013
b261b6cb9b21 (svn r11984) -Fix: Also draw corner shores under rail tracks.
frosch
parents: 8909
diff changeset
  1014
		default: NOT_REACHED();
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1015
	}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1016
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1017
	_current_player = OWNER_NONE;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1018
}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1019
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1020
/**
8227
9529f32a20fa (svn r11266) -Documentation: Add a few comments. Parts of BigBB's work on shores
belugas
parents: 8041
diff changeset
  1021
 * Let a water tile floods its diagonal adjoining tiles
8267
c600379bd333 (svn r11320) -Codechange: make lower halftiles at coast floodable. Patch by frosch.
rubidium
parents: 8254
diff changeset
  1022
 * called from tunnelbridge_cmd, and by TileLoop_Industry() and TileLoop_Track()
8227
9529f32a20fa (svn r11266) -Documentation: Add a few comments. Parts of BigBB's work on shores
belugas
parents: 8041
diff changeset
  1023
 *
9529f32a20fa (svn r11266) -Documentation: Add a few comments. Parts of BigBB's work on shores
belugas
parents: 8041
diff changeset
  1024
 * @param tile the water/shore tile that floods
9529f32a20fa (svn r11266) -Documentation: Add a few comments. Parts of BigBB's work on shores
belugas
parents: 8041
diff changeset
  1025
 */
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
  1026
void TileLoop_Water(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1027
{
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1028
	switch (GetFloodingBehaviour(tile)) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1029
		case FLOOD_ACTIVE:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1030
			for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1031
				TileIndex dest = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(dir));
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1032
				if (dest == INVALID_TILE) continue;
9180
f39e3460f0ab (svn r12350) -Fix [FS#1836](r11947): do not try ti flood water tile (performance increase)
glx
parents: 9112
diff changeset
  1033
				/* do not try to flood water tiles - increases performance a lot */
f39e3460f0ab (svn r12350) -Fix [FS#1836](r11947): do not try ti flood water tile (performance increase)
glx
parents: 9112
diff changeset
  1034
				if (IsTileType(dest, MP_WATER)) continue;
2989
99c95a3ebcaa (svn r3564) Several smaller changes:
tron
parents: 2951
diff changeset
  1035
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1036
				uint z_dest;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1037
				Slope slope_dest = (Slope)(GetFoundationSlope(dest, &z_dest) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1038
				if (z_dest > 0) continue;
43
3b93861c5478 (svn r44) Fix: Coast line near edge of map and near oilrigs (Dribbel)
dominik
parents: 39
diff changeset
  1039
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1040
				if (!HasBit(_flood_from_dirs[slope_dest], ReverseDir(dir))) continue;
43
3b93861c5478 (svn r44) Fix: Coast line near edge of map and near oilrigs (Dribbel)
dominik
parents: 39
diff changeset
  1041
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1042
				DoFloodTile(dest);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1043
			}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1044
			break;
43
3b93861c5478 (svn r44) Fix: Coast line near edge of map and near oilrigs (Dribbel)
dominik
parents: 39
diff changeset
  1045
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1046
		case FLOOD_DRYUP: {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1047
			Slope slope_here = (Slope)(GetFoundationSlope(tile, NULL) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1048
			uint check_dirs = _flood_from_dirs[slope_here];
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1049
			uint dir;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1050
			FOR_EACH_SET_BIT(dir, check_dirs) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1051
				TileIndex dest = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir((Direction)dir));
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1052
				if (dest == INVALID_TILE) continue;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1053
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1054
				FloodingBehaviour dest_behaviour = GetFloodingBehaviour(dest);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1055
				if ((dest_behaviour == FLOOD_ACTIVE) || (dest_behaviour == FLOOD_PASSIVE)) return;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1056
			}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1057
			DoDryUp(tile);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1058
			break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1059
		}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1060
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1061
		default: return;
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
  1062
	}
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1063
}
43
3b93861c5478 (svn r44) Fix: Coast line near edge of map and near oilrigs (Dribbel)
dominik
parents: 39
diff changeset
  1064
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1065
void ConvertGroundTilesIntoWaterTiles()
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1066
{
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1067
	TileIndex tile;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1068
	uint z;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1069
	Slope slope;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1070
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1071
	for (tile = 0; tile < MapSize(); ++tile) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1072
		slope = GetTileSlope(tile, &z);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1073
		if (IsTileType(tile, MP_CLEAR) && z == 0) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1074
			/* Make both water for tiles at level 0
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1075
			 * and make shore, as that looks much better
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1076
			 * during the generation. */
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1077
			switch (slope) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1078
				case SLOPE_FLAT:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1079
					MakeWater(tile);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1080
					break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1081
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1082
				case SLOPE_N:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1083
				case SLOPE_E:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1084
				case SLOPE_S:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1085
				case SLOPE_W:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1086
					MakeShore(tile);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1087
					break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1088
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1089
				default:
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1090
					uint check_dirs = _flood_from_dirs[slope & ~SLOPE_STEEP];
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1091
					uint dir;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1092
					FOR_EACH_SET_BIT(dir, check_dirs) {
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1093
						TileIndex dest = TILE_ADD(tile, TileOffsByDir((Direction)dir));
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1094
						Slope slope_dest = (Slope)(GetTileSlope(dest, NULL) & ~SLOPE_STEEP);
8909
fa15e9afad2f (svn r11983) -Codechange: Add some helper functions for slopes and use them.
frosch
parents: 8882
diff changeset
  1095
						if (slope_dest == SLOPE_FLAT || IsSlopeWithOneCornerRaised(slope_dest)) {
8876
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1096
							MakeShore(tile);
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1097
							break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1098
						}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1099
					}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1100
					break;
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1101
			}
a0b7938c6082 (svn r11947) -Feature: Make use of new sprites added by Action5 type 0D.
frosch
parents: 8864
diff changeset
  1102
		}
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
  1103
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1104
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1105
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9092
diff changeset
  1106
static TrackStatus GetTileTrackStatus_Water(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1107
{
3423
03e0e97abf41 (svn r4250) -Codechange: Further use of map accessors for water tiles
celestar
parents: 3422
diff changeset
  1108
	static const byte coast_tracks[] = {0, 32, 4, 0, 16, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0};
4169
b775328748af (svn r5606) Replace some magic numbers by proper TrackBits enums and macros
tron
parents: 4101
diff changeset
  1109
b775328748af (svn r5606) Replace some magic numbers by proper TrackBits enums and macros
tron
parents: 4101
diff changeset
  1110
	TrackBits ts;
b775328748af (svn r5606) Replace some magic numbers by proper TrackBits enums and macros
tron
parents: 4101
diff changeset
  1111
2951
2db3adee7736 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1112
	if (mode != TRANSPORT_WATER) return 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1113
3423
03e0e97abf41 (svn r4250) -Codechange: Further use of map accessors for water tiles
celestar
parents: 3422
diff changeset
  1114
	switch (GetWaterTileType(tile)) {
8967
0b56f973bcf0 (svn r12042) -Fix [FS#1676]: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
peter1138
parents: 8955
diff changeset
  1115
		case WATER_TILE_CLEAR: ts = (GetTileSlope(tile, NULL) == SLOPE_FLAT) ? TRACK_BIT_ALL : TRACK_BIT_NONE; break;
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
  1116
		case WATER_TILE_COAST: ts = (TrackBits)coast_tracks[GetTileSlope(tile, NULL) & 0xF]; break;
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
  1117
		case WATER_TILE_LOCK:  ts = AxisToTrackBits(DiagDirToAxis(GetLockDirection(tile))); break;
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
  1118
		case WATER_TILE_DEPOT: ts = AxisToTrackBits(GetShipDepotAxis(tile)); break;
3423
03e0e97abf41 (svn r4250) -Codechange: Further use of map accessors for water tiles
celestar
parents: 3422
diff changeset
  1119
		default: return 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1120
	}
3900
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1121
	if (TileX(tile) == 0) {
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
  1122
		/* NE border: remove tracks that connects NE tile edge */
3900
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1123
		ts &= ~(TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_RIGHT);
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1124
	}
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1125
	if (TileY(tile) == 0) {
6928
44797333bcbf (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6923
diff changeset
  1126
		/* NW border: remove tracks that connects NW tile edge */
3900
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1127
		ts &= ~(TRACK_BIT_Y | TRACK_BIT_LEFT | TRACK_BIT_UPPER);
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1128
	}
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9092
diff changeset
  1129
	return CombineTrackStatus(TrackBitsToTrackdirBits(ts), TRACKDIR_BIT_NONE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1130
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1131
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1902
diff changeset
  1132
static void ClickTile_Water(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1133
{
6507
26c45f253d31 (svn r8953) -Codechange: make the names of enums of WaterTileType consistent with respect to RailTileType and RoadTileType.
rubidium
parents: 6486
diff changeset
  1134
	if (GetWaterTileType(tile) == WATER_TILE_DEPOT) {
3423
03e0e97abf41 (svn r4250) -Codechange: Further use of map accessors for water tiles
celestar
parents: 3422
diff changeset
  1135
		TileIndex tile2 = GetOtherShipDepotTile(tile);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 168
diff changeset
  1136
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6574
diff changeset
  1137
		ShowDepotWindow(tile < tile2 ? tile : tile2, VEH_SHIP);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1138
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1139
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1140
2436
177cb6a8339f (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2261
diff changeset
  1141
static void ChangeTileOwner_Water(TileIndex tile, PlayerID old_player, PlayerID new_player)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1142
{
1901
fb05044cf5c3 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
  1143
	if (!IsTileOwner(tile, old_player)) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1144
4848
56549aa3e234 (svn r6774) -Codechange: Rename the badly named OWNER_SPECTATOR to PLAYER_SPECTATOR and
Darkvater
parents: 4638
diff changeset
  1145
	if (new_player != PLAYER_SPECTATOR) {
1902
5d653da1abb7 (svn r2408) Introduce SetTileOwner() and use it
tron
parents: 1901
diff changeset
  1146
		SetTileOwner(tile, new_player);
9016
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1147
		return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1148
	}
9016
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1149
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1150
	/* Remove depot */
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1151
	if (IsShipDepot(tile)) DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1152
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1153
	/* Set owner of canals and locks ... and also canal under dock there was before.
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1154
	 * Check if the new owner after removing depot isn't OWNER_WATER. */
2b722bde93ec (svn r12095) -Fix [FS#1703]: when a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road.
smatz
parents: 9015
diff changeset
  1155
	if (IsTileOwner(tile, old_player)) SetTileOwner(tile, OWNER_NONE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1156
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1157
8615
6b91ca653bad (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8612
diff changeset
  1158
static VehicleEnterTileStatus VehicleEnter_Water(Vehicle *v, TileIndex tile, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1159
{
6317
c73bda71ac16 (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 6205
diff changeset
  1160
	return VETSB_CONTINUE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1161
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1162
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1163
static CommandCost TerraformTile_Water(TileIndex tile, uint32 flags, uint z_new, Slope tileh_new)
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1164
{
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1165
	/* Canals can't be terraformed */
8235
fc75e5ad02b6 (svn r11276) -Codechange: be more consistent with naming of some accessors.
rubidium
parents: 8227
diff changeset
  1166
	if (IsWaterTile(tile) && IsCanal(tile)) return_cmd_error(STR_MUST_DEMOLISH_CANAL_FIRST);
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1167
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1168
	return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1169
}
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1170
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1171
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  1172
extern const TileTypeProcs _tile_type_water_procs = {
4344
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1173
	DrawTile_Water,           /* draw_tile_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1174
	GetSlopeZ_Water,          /* get_slope_z_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1175
	ClearTile_Water,          /* clear_tile_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1176
	GetAcceptedCargo_Water,   /* get_accepted_cargo_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1177
	GetTileDesc_Water,        /* get_tile_desc_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1178
	GetTileTrackStatus_Water, /* get_tile_track_status_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1179
	ClickTile_Water,          /* click_tile_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1180
	AnimateTile_Water,        /* animate_tile_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1181
	TileLoop_Water,           /* tile_loop_clear */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1182
	ChangeTileOwner_Water,    /* change_tile_owner_clear */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1183
	NULL,                     /* get_produced_cargo_proc */
5d0e40cd67b9 (svn r6045) -Cleanup: align all table-like structures using spaces, i.e. whitespace fixes only except for a few comments to make them uniform for the whole enum/struct.
rubidium
parents: 4231
diff changeset
  1184
	VehicleEnter_Water,       /* vehicle_enter_tile_proc */
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7829
diff changeset
  1185
	GetFoundation_Water,      /* get_foundation_proc */
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7939
diff changeset
  1186
	TerraformTile_Water,      /* terraform_tile_proc */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1187
};