src/road_cmd.cpp
author Tero Marttila <terom@fixme.fi>
Tue, 22 Jul 2008 21:51:14 +0300
changeset 11180 982e9f814f97
parent 11161 7d0fac8f14cd
permissions -rw-r--r--
scan for tarfiles in CACHE_DIR, remember what Subdirectory a tar was found in, set the GCF_FLAG on GRFs loaded from there, and hide those in the NewGRF GUI
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
10429
1b99254f9607 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 10378
diff changeset
     3
/** @file road_cmd.cpp Commands related to road tiles. */
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
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: 1785
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: 3176
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: 6459
diff changeset
     9
#include "cmd_helper.h"
3101
e2fdb8802c2f (svn r3696) Add functions to turn a tile into a normal rail tile/depot/waypoint. This is just a tiny step, the rail code needs way more love and caring
tron
parents: 3100
diff changeset
    10
#include "rail_map.h"
3144
426b825578f9 (svn r3763) Adapt to the new 'map accessors go in foo_map.h'-scheme
tron
parents: 3104
diff changeset
    11
#include "road_map.h"
8598
14ae80fe4c8f (svn r11663) -Codechange: moving of the road related types and functions.
rubidium
parents: 8592
diff changeset
    12
#include "road_internal.h"
4232
628628eaa4fc (svn r5796) Use DrawTileSprites/DrawTileSeqStruct for road depot drawing data, too
tron
parents: 4231
diff changeset
    13
#include "sprite.h"
8615
6b91ca653bad (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8612
diff changeset
    14
#include "tile_cmd.h"
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6585
diff changeset
    15
#include "landscape.h"
3319
7d04847e4689 (svn r4085) Add GetTown{Index,ByTile}() to get the town index resp. the town from a tile
tron
parents: 3286
diff changeset
    16
#include "town_map.h"
8720
4e60c30e2006 (svn r11787) -Codechange: more header rewrites. This time related to viewport.h.
rubidium
parents: 8707
diff changeset
    17
#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
    18
#include "command_func.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    19
#include "town.h"
3900
4984308f9125 (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
    20
#include "yapf/yapf.h"
10222
b6919c94cc77 (svn r12754) -Codechange: split depot.h into depot_map.h, depot_func.h and depot_base.h and remove quite a lot of unneeded (before this) includes of depot.h.
rubidium
parents: 10151
diff changeset
    21
#include "depot_base.h"
b6919c94cc77 (svn r12754) -Codechange: split depot.h into depot_map.h, depot_func.h and depot_base.h and remove quite a lot of unneeded (before this) includes of depot.h.
rubidium
parents: 10151
diff changeset
    22
#include "depot_func.h"
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
    23
#include "newgrf.h"
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
    24
#include "station_map.h"
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
    25
#include "tunnel_map.h"
8707
55835d8fbfcd (svn r11774) -Change: do not include variables.h in a header when it is not needed.
rubidium
parents: 8693
diff changeset
    26
#include "variables.h"
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    27
#include "autoslope.h"
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8328
diff changeset
    28
#include "transparency.h"
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
    29
#include "tunnelbridge_map.h"
8602
9e75e594a068 (svn r11667) -Codechange: split window.h into a header that defines some 'global' window related types, on that defined 'global' window functions and one that defines functions and types only used by *_gui.cpps.
rubidium
parents: 8598
diff changeset
    30
#include "window_func.h"
8610
17cc343a23dd (svn r11675) -Codechange: split the string types from the string functions.
rubidium
parents: 8604
diff changeset
    31
#include "strings_func.h"
8640
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8635
diff changeset
    32
#include "vehicle_func.h"
1e93b81e96d2 (svn r11706) -Codechange: split vehicle.h and remove another bunch of useless includes.
rubidium
parents: 8635
diff changeset
    33
#include "vehicle_base.h"
8653
a83f7a536919 (svn r11719) -Codechange: split sound.h in a header with types and one with functions.
rubidium
parents: 8640
diff changeset
    34
#include "sound_func.h"
8838
1549b7f9d0a8 (svn r11908) -Fix: update crossing when merging a company, when building a crossing and after loading older savegame
smatz
parents: 8804
diff changeset
    35
#include "road_func.h"
8894
1e5b2d4380b8 (svn r11968) -Codechange: remove redundant FindLengthOfTunnel(), use GetTunnelBridgeLength() and/or GetOtherTunnelEnd() instead
smatz
parents: 8886
diff changeset
    36
#include "tunnelbridge.h"
10225
8becb17444a7 (svn r12757) -Codechange: move all cheat related stuff from all over the place to a single location.
rubidium
parents: 10222
diff changeset
    37
#include "cheat_func.h"
10269
a833a213bf38 (svn r12801) -Codechange: remove the dependency of function.h in town_map.h
rubidium
parents: 10225
diff changeset
    38
#include "functions.h"
10272
2014f0bdc800 (svn r12804) -Codechange: move the effect vehicle handling out of vehicle.cpp
rubidium
parents: 10269
diff changeset
    39
#include "effectvehicle_func.h"
10473
ad730880e443 (svn r13016) -Codechange: unify the detection if rail catenary should be drawn
smatz
parents: 10429
diff changeset
    40
#include "elrail_func.h"
10316
6878402fa6e5 (svn r12857) -Fix [FS#1948]: remove the last uses of AutoPtr in the station code.
rubidium
parents: 10314
diff changeset
    41
#include "oldpool_func.h"
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
    42
8760
ce0891c412ce (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8750
diff changeset
    43
#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
    44
#include "table/strings.h"
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    45
10622
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    46
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    47
bool RoadVehiclesAreBuilt()
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    48
{
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    49
	const Vehicle* v;
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    50
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    51
	FOR_ALL_VEHICLES(v) {
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    52
		if (v->type == VEH_ROAD) return true;
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    53
	}
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    54
	return false;
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    55
}
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    56
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    57
/**
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    58
 * Change the side of the road vehicles drive on (server only).
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    59
 * @param tile unused
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    60
 * @param flags operation to perform
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    61
 * @param p1 the side of the road; 0 = left side and 1 = right side
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    62
 * @param p2 unused
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    63
 */
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    64
CommandCost CmdSetRoadDriveSide(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    65
{
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    66
	/* Check boundaries and you can only change this if NO vehicles have been built yet,
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    67
	 * except in the intro-menu where of course it's always possible to do so. */
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    68
	if (p1 > 1 || (_game_mode != GM_MENU && RoadVehiclesAreBuilt())) return CMD_ERROR;
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    69
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    70
	if (flags & DC_EXEC) {
10695
95e0154da7a0 (svn r13242) -Codechange: remove _opt_ptr.
rubidium
parents: 10690
diff changeset
    71
		if (_game_mode == GM_MENU) {
10828
e6bf52233c8a (svn r13379) -Fix (r13255): drive side can't be changed in intro
glx
parents: 10775
diff changeset
    72
			_settings_newgame.vehicle.road_side = p1;
10695
95e0154da7a0 (svn r13242) -Codechange: remove _opt_ptr.
rubidium
parents: 10690
diff changeset
    73
		} else {
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
    74
			_settings_game.vehicle.road_side = p1;
10695
95e0154da7a0 (svn r13242) -Codechange: remove _opt_ptr.
rubidium
parents: 10690
diff changeset
    75
		}
10622
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    76
		InvalidateWindow(WC_GAME_OPTIONS, 0);
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    77
	}
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    78
	return CommandCost();
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    79
}
210493828852 (svn r13166) -Codechange: CmdSetRoadDriveSide belongs in road_cmd.cpp, not settings_gui.cpp.
rubidium
parents: 10546
diff changeset
    80
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    81
#define M(x) (1 << (x))
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    82
/* Level crossings may only be built on these slopes */
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    83
static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
    84
#undef M
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    86
/* Invalid RoadBits on slopes  */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    87
static const RoadBits _invalid_tileh_slopes_road[2][15] = {
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    88
	/* The inverse of the mixable RoadBits on a leveled slope */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    89
	{
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    90
		ROAD_NONE,         // SLOPE_FLAT
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    91
		ROAD_NE | ROAD_SE, // SLOPE_W
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    92
		ROAD_NE | ROAD_NW, // SLOPE_S
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    93
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    94
		ROAD_NE,           // SLOPE_SW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    95
		ROAD_NW | ROAD_SW, // SLOPE_E
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    96
		ROAD_NONE,         // SLOPE_EW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    97
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    98
		ROAD_NW,           // SLOPE_SE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
    99
		ROAD_NONE,         // SLOPE_WSE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   100
		ROAD_SE | ROAD_SW, // SLOPE_N
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   101
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   102
		ROAD_SE,           // SLOPE_NW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   103
		ROAD_NONE,         // SLOPE_NS
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   104
		ROAD_NONE,         // SLOPE_ENW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   105
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   106
		ROAD_SW,           // SLOPE_NE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   107
		ROAD_NONE,         // SLOPE_SEN
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   108
		ROAD_NONE          // SLOPE_NWS
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   109
	},
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   110
	/* The inverse of the allowed straight roads on a slope
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   111
	 * (with and without a foundation). */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   112
	{
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   113
		ROAD_NONE, // SLOPE_FLAT
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   114
		ROAD_NONE, // SLOPE_W    Foundation
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   115
		ROAD_NONE, // SLOPE_S    Foundation
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   116
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   117
		ROAD_Y,    // SLOPE_SW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   118
		ROAD_NONE, // SLOPE_E    Foundation
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   119
		ROAD_ALL,  // SLOPE_EW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   120
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   121
		ROAD_X,    // SLOPE_SE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   122
		ROAD_ALL,  // SLOPE_WSE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   123
		ROAD_NONE, // SLOPE_N    Foundation
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   124
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   125
		ROAD_X,    // SLOPE_NW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   126
		ROAD_ALL,  // SLOPE_NS
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   127
		ROAD_ALL,  // SLOPE_ENW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   128
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   129
		ROAD_Y,    // SLOPE_NE
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   130
		ROAD_ALL,  // SLOPE_SEN
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   131
		ROAD_ALL   // SLOPE_NW
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   132
	}
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   133
};
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   134
8880
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   135
Foundation GetRoadFoundation(Slope tileh, RoadBits bits);
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   136
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   137
/**
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   138
 * Is it allowed to remove the given road bits from the given tile?
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   139
 * @param tile      the tile to remove the road from
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   140
 * @param remove    the roadbits that are going to be removed
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   141
 * @param owner     the actual owner of the roadbits of the tile
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   142
 * @param rt        the road type to remove the bits from
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   143
 * @param flags     command flags
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   144
 * @param town_check Shall the town rating checked/affected
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   145
 * @return true when it is allowed to remove the road bits
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   146
 */
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   147
bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, RoadType rt, uint32 flags, bool town_check)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   148
{
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   149
	if (_game_mode == GM_EDITOR || remove == ROAD_NONE) return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   150
7247
78a25ab85148 (svn r9986) -Fix (r9934): flooding towns could not remove tram tracks (boekabart).
rubidium
parents: 7228
diff changeset
   151
	/* Water can always flood and towns can always remove "normal" road pieces.
78a25ab85148 (svn r9986) -Fix (r9934): flooding towns could not remove tram tracks (boekabart).
rubidium
parents: 7228
diff changeset
   152
	 * Towns are not be allowed to remove non "normal" road pieces, like tram
78a25ab85148 (svn r9986) -Fix (r9934): flooding towns could not remove tram tracks (boekabart).
rubidium
parents: 7228
diff changeset
   153
	 * tracks as that would result in trams that cannot turn. */
78a25ab85148 (svn r9986) -Fix (r9934): flooding towns could not remove tram tracks (boekabart).
rubidium
parents: 7228
diff changeset
   154
	if (_current_player == OWNER_WATER ||
11161
7d0fac8f14cd (svn r13719) -Codechange: rename IsValidPlayer to IsValidPlayerID in line with all other structs/classes that are in a pool.
rubidium
parents: 11064
diff changeset
   155
			(rt == ROADTYPE_ROAD && !IsValidPlayerID(_current_player))) return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   156
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   157
	/* Only do the special processing if the road is owned
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   158
	 * by a town */
4849
9a3c3ae7f62f (svn r6775) -Codechange: Use some more proper types, especially Owner and PlayerID as
Darkvater
parents: 4848
diff changeset
   159
	if (owner != OWNER_TOWN) return (owner == OWNER_NONE) || CheckOwnership(owner);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   160
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   161
	if (!town_check) return true;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   162
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
   163
	if (_cheats.magic_bulldozer.value) return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   164
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   165
	Town *t = ClosestTownFromTile(tile, UINT_MAX);
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   166
	if (t == NULL) return true;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   167
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   168
	/* check if you're allowed to remove the street owned by a town
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   169
	 * removal allowance depends on difficulty setting */
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   170
	if (!CheckforTownRating(flags, t, ROAD_REMOVE)) return false;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   171
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   172
	/* Get a bitmask of which neighbouring roads has a tile */
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   173
	RoadBits n = ROAD_NONE;
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   174
	RoadBits present = GetAnyRoadBits(tile, rt);
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   175
	if (present & ROAD_NE && GetAnyRoadBits(TILE_ADDXY(tile, -1,  0), rt) & ROAD_SW) n |= ROAD_NE;
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   176
	if (present & ROAD_SE && GetAnyRoadBits(TILE_ADDXY(tile,  0,  1), rt) & ROAD_NW) n |= ROAD_SE;
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   177
	if (present & ROAD_SW && GetAnyRoadBits(TILE_ADDXY(tile,  1,  0), rt) & ROAD_NE) n |= ROAD_SW;
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   178
	if (present & ROAD_NW && GetAnyRoadBits(TILE_ADDXY(tile,  0, -1), rt) & ROAD_SE) n |= ROAD_NW;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   179
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   180
	int rating_decrease = RATING_ROAD_DOWN_STEP_EDGE;
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   181
	/* If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   182
	 * then allow it */
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   183
	if (KillFirstBit(n) != ROAD_NONE && (n & remove) != ROAD_NONE) {
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   184
		/* you can remove all kind of roads with extra dynamite */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   185
		if (!_settings_game.construction.extra_dynamite) {
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   186
			SetDParam(0, t->index);
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   187
			_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   188
			return false;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   189
		}
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   190
		rating_decrease = RATING_ROAD_DOWN_STEP_INNER;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   191
	}
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   192
	ChangeTownRating(t, rating_decrease, RATING_ROAD_MINIMUM);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   193
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   194
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   195
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   196
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   197
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   198
/** Delete a piece of road.
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: 3435
diff changeset
   199
 * @param tile tile where to remove road from
6979
d194d25020e7 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6923
diff changeset
   200
 * @param flags operation to perform
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   201
 * @param pieces roadbits to remove
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   202
 * @param rt roadtype to remove
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   203
 * @param crossing_check should we check if there is a tram track when we are removing road from crossing?
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   204
 */
10151
9af8e9f342b7 (svn r12682) -Fix [FS#1920]: removing road pieces from a town gave you twice the intended penalty.
rubidium
parents: 10085
diff changeset
   205
static CommandCost RemoveRoad(TileIndex tile, uint32 flags, RoadBits pieces, RoadType rt, bool crossing_check, bool town_check = true)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   206
{
10689
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   207
	RoadTypes rts = GetRoadTypes(tile);
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   208
	/* The tile doesn't have the given road type */
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   209
	if (!HasBit(rts, rt)) return CMD_ERROR;
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   210
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   211
	bool town_road_under_stop = false;
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   212
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   213
	switch (GetTileType(tile)) {
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7851
diff changeset
   214
		case MP_ROAD:
8571
052b7794484d (svn r11636) -Fix: it was possible to build/remove road/tram in tunnel/bridge when there was vehicle in it
smatz
parents: 8539
diff changeset
   215
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   216
			break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   217
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   218
		case MP_STATION:
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   219
			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   220
			if (rt == ROADTYPE_ROAD) town_road_under_stop = GetStopBuiltOnTownRoad(tile);
8571
052b7794484d (svn r11636) -Fix: it was possible to build/remove road/tram in tunnel/bridge when there was vehicle in it
smatz
parents: 8539
diff changeset
   221
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   222
			break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   223
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   224
		case MP_TUNNELBRIDGE:
8886
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   225
			if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return CMD_ERROR;
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   226
			if (GetVehicleTunnelBridge(tile, GetOtherTunnelBridgeEnd(tile)) != NULL) return CMD_ERROR;
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   227
			break;
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   228
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   229
		default:
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   230
			return CMD_ERROR;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   231
	}
1638
aae181b00846 (svn r2142) - Fix: Game no longer crashes when you want to remove a piece of road under a bridge that belongs to the town. TODO: railcrossings store owner somewhere else, put it into _map_owner[]!
Darkvater
parents: 1398
diff changeset
   232
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   233
	if (!CheckAllowRemoveRoad(tile, pieces, town_road_under_stop ? OWNER_TOWN : GetRoadOwner(tile, rt), rt, flags, town_check)) return CMD_ERROR;
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   234
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7851
diff changeset
   235
	if (!IsTileType(tile, MP_ROAD)) {
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   236
		/* If it's the last roadtype, just clear the whole tile */
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   237
		if (rts == RoadTypeToRoadTypes(rt)) return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   238
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
   239
		CommandCost cost(EXPENSES_CONSTRUCTION);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   240
		if (IsTileType(tile, MP_TUNNELBRIDGE)) {
8693
3d721429cc4f (svn r11760) -Codechange: unify the way how other end of a tunnel/bridge is determined at some places
smatz
parents: 8683
diff changeset
   241
			TileIndex other_end = GetOtherTunnelBridgeEnd(tile);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   242
			/* Pay for *every* tile of the bridge or tunnel */
8894
1e5b2d4380b8 (svn r11968) -Codechange: remove redundant FindLengthOfTunnel(), use GetTunnelBridgeLength() and/or GetOtherTunnelEnd() instead
smatz
parents: 8886
diff changeset
   243
			cost.AddCost((GetTunnelBridgeLength(other_end, tile) + 2) * _price.remove_road);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   244
			if (flags & DC_EXEC) {
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   245
				SetRoadTypes(other_end, GetRoadTypes(other_end) & ~RoadTypeToRoadTypes(rt));
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   246
				SetRoadTypes(tile, GetRoadTypes(tile) & ~RoadTypeToRoadTypes(rt));
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   247
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   248
				/* Mark tiles diry that have been repaved */
7210
508c55fdc09e (svn r9946) -Fix: more places that weren't correctly marked dirty...
rubidium
parents: 7209
diff changeset
   249
				MarkTileDirtyByTile(tile);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   250
				MarkTileDirtyByTile(other_end);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   251
				if (IsBridge(tile)) {
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
   252
					TileIndexDiff delta = TileOffsByDiagDir(GetTunnelBridgeDirection(tile));
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   253
7209
52241eea3899 (svn r9945) -Fix: bridges were not properly marked dirty when adding/removing roadtypes.
rubidium
parents: 7207
diff changeset
   254
					for (TileIndex t = tile + delta; t != other_end; t += delta) MarkTileDirtyByTile(t);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   255
				}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   256
			}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   257
		} else {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   258
			cost.AddCost(_price.remove_road);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   259
			if (flags & DC_EXEC) {
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   260
				SetRoadTypes(tile, GetRoadTypes(tile) & ~RoadTypeToRoadTypes(rt));
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   261
				MarkTileDirtyByTile(tile);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   262
			}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   263
		}
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
   264
		return cost;
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   265
	}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   266
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   267
	switch (GetRoadTileType(tile)) {
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   268
		case ROAD_TILE_NORMAL: {
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   269
			const Slope tileh = GetTileSlope(tile, NULL);
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   270
			RoadBits present = GetRoadBits(tile, rt);
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   271
			const RoadBits other = GetOtherRoadBits(tile, rt);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   272
			const Foundation f = GetRoadFoundation(tileh, present);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   273
10378
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   274
			if (HasRoadWorks(tile) && _current_player != OWNER_WATER) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   275
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   276
			/* Autocomplete to a straight road
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   277
			 * @li on steep slopes
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   278
			 * @li if the bits of the other roadtypes result in another foundation
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   279
			 * @li if build on slopes is disabled */
9243
3cac8fe1bd25 (svn r12443) -Add: OpenTTDs version to openttd.cfg, just so we do not need to keep to ask people for their version number because it's likely they give you the wrong answer anyway.
rubidium
parents: 9242
diff changeset
   280
			if (IsSteepSlope(tileh) || (IsStraightRoad(other) &&
3cac8fe1bd25 (svn r12443) -Add: OpenTTDs version to openttd.cfg, just so we do not need to keep to ask people for their version number because it's likely they give you the wrong answer anyway.
rubidium
parents: 9242
diff changeset
   281
					(other & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) != ROAD_NONE) ||
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   282
					(tileh != SLOPE_FLAT && !_settings_game.construction.build_on_slopes)) {
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   283
				pieces |= MirrorRoadBits(pieces);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   284
			}
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   285
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   286
			/* limit the bits to delete to the existing bits. */
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   287
			pieces &= present;
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   288
			if (pieces == ROAD_NONE) return CMD_ERROR;
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   289
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   290
			/* Now set present what it will be after the remove */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   291
			present ^= pieces;
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   292
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   293
			/* Check for invalid RoadBit combinations on slopes */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   294
			if (tileh != SLOPE_FLAT && present != ROAD_NONE &&
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   295
					(present & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) == present) {
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   296
				return CMD_ERROR;
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   297
			}
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   298
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   299
			if (flags & DC_EXEC) {
10378
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   300
				if (HasRoadWorks(tile)) {
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   301
					/* flooding tile with road works, don't forget to remove the effect vehicle too */
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   302
					assert(_current_player == OWNER_WATER);
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   303
					Vehicle *v;
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   304
					FOR_ALL_VEHICLES(v) {
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   305
						if (v->type == VEH_EFFECT && TileVirtXY(v->x_pos, v->y_pos) == tile) {
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   306
							delete v;
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   307
						}
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   308
					}
ecad8e9b4cb6 (svn r12919) -Fix [FS#1965]: flood road tiles even when there are road works in progress
smatz
parents: 10316
diff changeset
   309
				}
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   310
				if (present == ROAD_NONE) {
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   311
					RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   312
					if (rts == ROADTYPES_NONE) {
8032
0901aabd9aef (svn r11056) -Fix [FS#1213]: road/tram tiles would not always get marked dirty properly, causing glitches for non-local players. Patch by SmatZ.
rubidium
parents: 8012
diff changeset
   313
						/* Includes MarkTileDirtyByTile() */
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   314
						DoClearSquare(tile);
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   315
					} else {
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   316
						SetRoadBits(tile, ROAD_NONE, rt);
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   317
						SetRoadTypes(tile, rts);
8032
0901aabd9aef (svn r11056) -Fix [FS#1213]: road/tram tiles would not always get marked dirty properly, causing glitches for non-local players. Patch by SmatZ.
rubidium
parents: 8012
diff changeset
   318
						MarkTileDirtyByTile(tile);
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   319
					}
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   320
				} else {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   321
					/* When bits are removed, you *always* end up with something that
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   322
					 * is not a complete straight road tile. However, trams do not have
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   323
					 * onewayness, so they cannot remove it either. */
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   324
					if (rt != ROADTYPE_TRAM) SetDisallowedRoadDirections(tile, DRD_NONE);
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   325
					SetRoadBits(tile, present, rt);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   326
					MarkTileDirtyByTile(tile);
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   327
				}
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   328
			}
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   329
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   330
			/* If we change the foundation we have to pay for it. */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   331
			return CommandCost(EXPENSES_CONSTRUCTION, CountBits(pieces) * _price.remove_road +
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   332
					((GetRoadFoundation(tileh, present) != f) ? _price.terraform : (Money)0));
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   333
		}
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   334
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   335
		case ROAD_TILE_CROSSING: {
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   336
			if (pieces & ComplementRoadBits(GetCrossingRoadBits(tile))) {
3176
c125ec95763a (svn r3812) Remove a pointless goto
tron
parents: 3167
diff changeset
   337
				return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   338
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   339
7193
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
   340
			/* Don't allow road to be removed from the crossing when there is tram;
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
   341
			 * we can't draw the crossing without trambits ;) */
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   342
			if (rt == ROADTYPE_ROAD && HasTileRoadType(tile, ROADTYPE_TRAM) && (flags & DC_EXEC || crossing_check)) return CMD_ERROR;
7193
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
   343
8683
1f3141299c8e (svn r11750) -Revert (r11749): commited too much
glx
parents: 8682
diff changeset
   344
			if (flags & DC_EXEC) {
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   345
				RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   346
				if (rts == ROADTYPES_NONE) {
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   347
					MakeRailNormal(tile, GetTileOwner(tile), GetCrossingRailBits(tile), GetRailType(tile));
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   348
				} else {
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   349
					SetRoadTypes(tile, rts);
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   350
				}
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   351
				MarkTileDirtyByTile(tile);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   352
				YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile)));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   353
			}
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
   354
			return CommandCost(EXPENSES_CONSTRUCTION, _price.remove_road * 2);
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   355
		}
3977
edb5b94e2094 (svn r5155) - Remove the bridge branch merge (revision r5070)
tron
parents: 3933
diff changeset
   356
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   357
		default:
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   358
		case ROAD_TILE_DEPOT:
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   359
			return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   360
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   361
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   363
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   364
/** Delete a piece of road.
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   365
 * @param tile tile where to remove road from
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   366
 * @param flags operation to perform
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   367
 * @param p1 bit 0..3 road pieces to remove (RoadBits)
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   368
 *           bit 4..5 road type
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   369
 * @param p2 unused
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   370
 */
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   371
CommandCost CmdRemoveRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   372
{
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   373
	RoadType rt = (RoadType)GB(p1, 4, 2);
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   374
	if (!IsValidRoadType(rt)) return CMD_ERROR;
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   375
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   376
	RoadBits pieces = Extract<RoadBits, 0>(p1);
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   377
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   378
	return RemoveRoad(tile, flags, pieces, rt, true);
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   379
}
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   380
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   381
/**
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   382
 * Calculate the costs for roads on slopes
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   383
 *  Aside modify the RoadBits to fit on the slopes
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   384
 *
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   385
 * @note The RoadBits are modified too!
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   386
 * @param tileh The current slope
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   387
 * @param pieces The RoadBits we want to add
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   388
 * @param existing The existent RoadBits of the current type
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   389
 * @param other The other existent RoadBits
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   390
 * @return The costs for these RoadBits on this slope
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   391
 */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   392
static CommandCost CheckRoadSlope(Slope tileh, RoadBits *pieces, RoadBits existing, RoadBits other)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   393
{
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   394
	/* Remove already build pieces */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   395
	CLRBITS(*pieces, existing);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   396
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   397
	/* If we can't build anything stop here */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   398
	if (*pieces == ROAD_NONE) return CMD_ERROR;
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   399
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   400
	/* All RoadBit combos are valid on flat land */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   401
	if (tileh == SLOPE_FLAT) return CommandCost();
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   402
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   403
	/* Proceed steep Slopes first to reduce lookup table size */
4246
14a8849c32df (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4232
diff changeset
   404
	if (IsSteepSlope(tileh)) {
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   405
		/* Force straight roads. */
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   406
		*pieces |= MirrorRoadBits(*pieces);
7828
b78d1fab57da (svn r10695) -Fix [FS#1079]: building single pieces of road over tramtrack or vice versa on slopes did not work as expected.
rubidium
parents: 7762
diff changeset
   407
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   408
		/* Use existing as all existing since only straight
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   409
		 * roads are allowed here. */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   410
		existing |= other;
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   411
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   412
		if ((existing == ROAD_NONE || existing == *pieces) && IsStraightRoad(*pieces)) {
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   413
			return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
4246
14a8849c32df (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4232
diff changeset
   414
		}
14a8849c32df (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4232
diff changeset
   415
		return CMD_ERROR;
14a8849c32df (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4232
diff changeset
   416
	}
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   417
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   418
	/* Save the merge of all bits of the current type */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   419
	RoadBits type_bits = existing | *pieces;
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   420
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   421
	/* Roads on slopes */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   422
	if (_settings_game.construction.build_on_slopes && (_invalid_tileh_slopes_road[0][tileh] & (other | type_bits)) == ROAD_NONE) {
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   423
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   424
		/* If we add leveling we've got to pay for it */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   425
		if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   426
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   427
		return CommandCost();
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
   428
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   429
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   430
	/* Autocomplete uphill roads */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   431
	*pieces |= MirrorRoadBits(*pieces);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   432
	type_bits = existing | *pieces;
3381
ebdcc12845c7 (svn r4187) Simplify the code for building/removing a piece of road a bit
tron
parents: 3379
diff changeset
   433
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   434
	/* Uphill roads */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   435
	if (IsStraightRoad(type_bits) && (other == type_bits || other == ROAD_NONE) &&
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   436
			(_invalid_tileh_slopes_road[1][tileh] & (other | type_bits)) == ROAD_NONE) {
3381
ebdcc12845c7 (svn r4187) Simplify the code for building/removing a piece of road a bit
tron
parents: 3379
diff changeset
   437
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   438
		/* Slopes with foundation ? */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   439
		if (IsSlopeWithOneCornerRaised(tileh)) {
7828
b78d1fab57da (svn r10695) -Fix [FS#1079]: building single pieces of road over tramtrack or vice versa on slopes did not work as expected.
rubidium
parents: 7762
diff changeset
   440
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   441
			/* Prevent build on slopes if it isn't allowed */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   442
			if (_settings_game.construction.build_on_slopes) {
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   443
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   444
				/* If we add foundation we've got to pay for it */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   445
				if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   446
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   447
				return CommandCost();
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   448
			}
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   449
		} else {
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   450
			if (CountBits(existing) == 1) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   451
			return CommandCost();
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   452
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   453
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   454
	return CMD_ERROR;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   455
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   456
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   457
/** Build a piece of road.
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: 3435
diff changeset
   458
 * @param tile tile where to build road
6979
d194d25020e7 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6923
diff changeset
   459
 * @param flags operation to perform
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   460
 * @param p1 bit 0..3 road pieces to build (RoadBits)
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   461
 *           bit 4..5 road type
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   462
 *           bit 6..7 disallowed directions to toggle
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   463
 * @param p2 the town that is building the road (0 if not applicable)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   464
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   465
CommandCost CmdBuildRoad(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   466
{
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
   467
	CommandCost cost(EXPENSES_CONSTRUCTION);
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   468
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   469
	RoadBits existing = ROAD_NONE;
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   470
	RoadBits other_bits = ROAD_NONE;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   471
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   472
	/* Road pieces are max 4 bitset values (NE, NW, SE, SW) and town can only be non-zero
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   473
	 * if a non-player is building the road */
11161
7d0fac8f14cd (svn r13719) -Codechange: rename IsValidPlayer to IsValidPlayerID in line with all other structs/classes that are in a pool.
rubidium
parents: 11064
diff changeset
   474
	if ((IsValidPlayerID(_current_player) && p2 != 0) || (_current_player == OWNER_TOWN && !IsValidTownID(p2))) return CMD_ERROR;
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   475
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   476
	RoadBits pieces = Extract<RoadBits, 0>(p1);
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   477
9186
653a01190f32 (svn r12363) -Fix: do not allow building 'zero' road bits
smatz
parents: 9143
diff changeset
   478
	/* do not allow building 'zero' road bits, code wouldn't handle it */
653a01190f32 (svn r12363) -Fix: do not allow building 'zero' road bits
smatz
parents: 9143
diff changeset
   479
	if (pieces == ROAD_NONE) return CMD_ERROR;
653a01190f32 (svn r12363) -Fix: do not allow building 'zero' road bits
smatz
parents: 9143
diff changeset
   480
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   481
	RoadType rt = (RoadType)GB(p1, 4, 2);
8353
49a1d9b9d937 (svn r11407) -Fix: do not allow building of tram-tracks when they are not available (SmatZ)
truelight
parents: 8345
diff changeset
   482
	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   483
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   484
	DisallowedRoadDirections toggle_drd = (DisallowedRoadDirections)GB(p1, 6, 2);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   485
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   486
	Slope tileh = GetTileSlope(tile, NULL);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   487
3434
21094a78dcdb (svn r4263) -Codechange: Road building no longer uses FindLandscapeHeight. Last occurence of FindLandscapeTile in the tile-specific functions gone. Thanks to Tron for doing lots of work in this direction
celestar
parents: 3430
diff changeset
   488
	switch (GetTileType(tile)) {
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7851
diff changeset
   489
		case MP_ROAD:
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   490
			switch (GetRoadTileType(tile)) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   491
				case ROAD_TILE_NORMAL: {
4046
566de0b02064 (svn r5315) -Fix: Prohibit altering a road tile while road works are in progress
tron
parents: 4000
diff changeset
   492
					if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
7252
9a5ca22a83c8 (svn r9991) -Fix: one could build road when trams were driving on the tile and vice versa.
rubidium
parents: 7247
diff changeset
   493
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   494
					other_bits = GetOtherRoadBits(tile, rt);
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   495
					if (!HasTileRoadType(tile, rt)) break;
4046
566de0b02064 (svn r5315) -Fix: Prohibit altering a road tile while road works are in progress
tron
parents: 4000
diff changeset
   496
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   497
					existing = GetRoadBits(tile, rt);
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   498
					bool crossing = !IsStraightRoad(existing | pieces);
7264
6e0199b059b9 (svn r10004) -Fix: trams can always intersect/have junctions on one way roads (because they only work for busses and lorries).
rubidium
parents: 7260
diff changeset
   499
					if (rt != ROADTYPE_TRAM && (GetDisallowedRoadDirections(tile) != DRD_NONE || toggle_drd != DRD_NONE) && crossing) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   500
						/* Junctions cannot be one-way */
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   501
						return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   502
					}
3150
025fe8cd7104 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3149
diff changeset
   503
					if ((existing & pieces) == pieces) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   504
						/* We only want to set the (dis)allowed road directions */
10689
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   505
						if (toggle_drd != DRD_NONE && rt != ROADTYPE_TRAM && IsRoadOwner(tile, ROADTYPE_ROAD, _current_player)) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   506
							if (crossing) return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   507
9097
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   508
							if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   509
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   510
							/* Ignore half built tiles */
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   511
							if (flags & DC_EXEC && rt != ROADTYPE_TRAM && IsStraightRoad(existing)) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   512
								SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   513
								MarkTileDirtyByTile(tile);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   514
							}
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   515
							return CommandCost();
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   516
						}
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
   517
						return_cmd_error(STR_1007_ALREADY_BUILT);
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
   518
					}
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   519
				} break;
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
   520
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   521
				case ROAD_TILE_CROSSING:
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   522
					if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   523
					other_bits = GetCrossingRoadBits(tile);
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   524
					if (pieces & ComplementRoadBits(other_bits)) goto do_clear;
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   525
					break;
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
   526
3069
0e6aca11c3da (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents: 3068
diff changeset
   527
				default:
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   528
				case ROAD_TILE_DEPOT:
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
   529
					goto do_clear;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   530
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   531
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   532
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   533
		case MP_RAILWAY: {
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
   534
			if (IsSteepSlope(tileh)) {
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   535
				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   536
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   537
3104
106ca8c3d959 (svn r3699) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers
tron
parents: 3103
diff changeset
   538
			/* Level crossings may only be built on these slopes */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   539
			if (!HasBit(VALID_LEVEL_CROSSING_SLOPES, tileh)) {
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   540
				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   541
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   542
3792
2eb8388731bf (svn r4788) - Codechange: RAILTYPE_{NORMAL,ELECTRIC,...} and RAIL_TYPE_{NORMAL,SIGNAL,...} have nearly the same name, rename RAIL_TYPE_* to RAIL_TILE_* of extra clarity
rubidium
parents: 3673
diff changeset
   543
			if (GetRailTileType(tile) != RAIL_TILE_NORMAL) goto do_clear;
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   544
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   545
			Axis roaddir;
3269
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   546
			switch (GetTrackBits(tile)) {
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   547
				case TRACK_BIT_X:
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   548
					if (pieces & ROAD_X) goto do_clear;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   549
					roaddir = AXIS_Y;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   550
					break;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   551
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   552
				case TRACK_BIT_Y:
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   553
					if (pieces & ROAD_Y) goto do_clear;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   554
					roaddir = AXIS_X;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   555
					break;
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   556
95e7bffcb3c5 (svn r3981) More work for the rail accessing functions and enums
tron
parents: 3267
diff changeset
   557
				default: goto do_clear;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   558
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   559
6902
9da0ee122fd5 (svn r9542) -Fix(FS# 712): When checking if a vehicle is on a given tile, and you are working on the ground tile, do not take aircrafts into account, as they do not pose any danger for the construction/destruction/conversion itself. Z stuff, in other words
belugas
parents: 6889
diff changeset
   560
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
3381
ebdcc12845c7 (svn r4187) Simplify the code for building/removing a piece of road a bit
tron
parents: 3379
diff changeset
   561
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   562
			if (flags & DC_EXEC) {
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   563
				YapfNotifyTrackLayoutChange(tile, FindFirstTrack(GetTrackBits(tile)));
7193
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
   564
				/* Always add road to the roadtypes (can't draw without it) */
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
   565
				MakeRoadCrossing(tile, _current_player, _current_player, _current_player, GetTileOwner(tile), roaddir, GetRailType(tile), RoadTypeToRoadTypes(rt) | ROADTYPES_ROAD, p2);
8840
81cfba69eddd (svn r11910) -Fix: play 'ding-ding' crossing sound in more cases (except gameload and crossing construction)
smatz
parents: 8838
diff changeset
   566
				UpdateLevelCrossing(tile, false);
3100
552cf19c49cb (svn r3695) Add 2 MarkTileByTile() which I forgot in r3689 (noticed by Belugas)
tron
parents: 3099
diff changeset
   567
				MarkTileDirtyByTile(tile);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   568
			}
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
   569
			return CommandCost(EXPENSES_CONSTRUCTION, _price.build_road * (rt == ROADTYPE_ROAD ? 2 : 4));
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
   570
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   571
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   572
		case MP_STATION:
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   573
			if (!IsDriveThroughStopTile(tile)) return CMD_ERROR;
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   574
			if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   575
			break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   576
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   577
		case MP_TUNNELBRIDGE:
8886
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   578
			if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return CMD_ERROR;
11064
7ebca843450b (svn r13621) -Fix: building roadbits in the wrong direction on bridges or building roadbits from underneath the bridge to the bridgehead is impossible, so don't silently ignore that error when building over houses and industries is not ignored.
rubidium
parents: 10828
diff changeset
   579
			if (MirrorRoadBits(DiagDirToRoadBits(GetTunnelBridgeDirection(tile))) != pieces) return CMD_ERROR;
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   580
			if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
8886
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   581
			/* Don't allow adding roadtype to the bridge/tunnel when vehicles are already driving on it */
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   582
			if (GetVehicleTunnelBridge(tile, GetOtherTunnelBridgeEnd(tile)) != NULL) return CMD_ERROR;
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   583
			break;
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   584
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   585
		default: {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   586
do_clear:;
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   587
			CommandCost ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
3381
ebdcc12845c7 (svn r4187) Simplify the code for building/removing a piece of road a bit
tron
parents: 3379
diff changeset
   588
			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
   589
			cost.AddCost(ret);
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   590
		} break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   591
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   592
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   593
	if (other_bits != pieces) {
7211
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   594
		/* Check the foundation/slopes when adding road/tram bits */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   595
		CommandCost ret = CheckRoadSlope(tileh, &pieces, existing, other_bits);
7211
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   596
		/* Return an error if we need to build a foundation (ret != 0) but the
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   597
		 * current patch-setting is turned off (or stupid AI@work) */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   598
		if (CmdFailed(ret) || (ret.GetCost() != 0 && !_settings_game.construction.build_on_slopes)) {
7211
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   599
			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   600
		}
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   601
		cost.AddCost(ret);
7211
2e9a89c80c8d (svn r9947) -Fix [FS#807]: don't check whether roadbits may be built when they are already built for another type.
rubidium
parents: 7210
diff changeset
   602
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   603
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7851
diff changeset
   604
	if (IsTileType(tile, MP_ROAD)) {
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   605
		/* Don't put the pieces that already exist */
3150
025fe8cd7104 (svn r3773) Shove some semantics down ottd's throat by replacing ints and magic numbers by enums and some related changes
tron
parents: 3149
diff changeset
   606
		pieces &= ComplementRoadBits(existing);
8880
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   607
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   608
		/* Check if new road bits will have the same foundation as other existing road types */
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   609
		if (IsNormalRoad(tile)) {
8880
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   610
			Slope slope = GetTileSlope(tile, NULL);
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   611
			Foundation found_new = GetRoadFoundation(slope, pieces | existing);
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   612
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   613
			/* Test if all other roadtypes can be built at that foundation */
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   614
			for (RoadType rtest = ROADTYPE_ROAD; rtest < ROADTYPE_END; rtest++) {
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   615
				if (rtest != rt) { // check only other road types
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   616
					RoadBits bits = GetRoadBits(tile, rtest);
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   617
					/* do not check if there are not road bits of given type */
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   618
					if (bits != ROAD_NONE && GetRoadFoundation(slope, bits) != found_new) {
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   619
						return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   620
					}
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   621
				}
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   622
			}
6ae9ec825155 (svn r11953) -Fix (r11172): do not allow modifying roadbits when other roadtypes would need different foundation
smatz
parents: 8840
diff changeset
   623
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   624
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   625
9097
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   626
	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   627
8328
6909973c8359 (svn r11382) -Codechange: renamed COUNTBITS to CountBits, as it is no longer a macro (skidd13)
truelight
parents: 8315
diff changeset
   628
	cost.AddCost(CountBits(pieces) * _price.build_road);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   629
	if (IsTileType(tile, MP_TUNNELBRIDGE)) {
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   630
		/* Pay for *every* tile of the bridge or tunnel */
8894
1e5b2d4380b8 (svn r11968) -Codechange: remove redundant FindLengthOfTunnel(), use GetTunnelBridgeLength() and/or GetOtherTunnelEnd() instead
smatz
parents: 8886
diff changeset
   631
		cost.MultiplyCost(GetTunnelBridgeLength(GetOtherTunnelBridgeEnd(tile), tile) + 2);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   632
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   633
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   634
	if (flags & DC_EXEC) {
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   635
		switch (GetTileType(tile)) {
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7851
diff changeset
   636
			case MP_ROAD: {
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   637
				RoadTileType rtt = GetRoadTileType(tile);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   638
				if (existing == ROAD_NONE || rtt == ROAD_TILE_CROSSING) {
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   639
					SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   640
					SetRoadOwner(tile, rt, _current_player);
7464
1ea676d8eb7d (svn r10224) -Fix [FS#891]: the town road belongs to didn't get set properly when a town builds road over tram bits.
rubidium
parents: 7461
diff changeset
   641
					if (_current_player == OWNER_TOWN && rt == ROADTYPE_ROAD) SetTownIndex(tile, p2);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   642
				}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   643
				if (rtt != ROAD_TILE_CROSSING) SetRoadBits(tile, existing | pieces, rt);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   644
			} break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   645
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   646
			case MP_TUNNELBRIDGE: {
8693
3d721429cc4f (svn r11760) -Codechange: unify the way how other end of a tunnel/bridge is determined at some places
smatz
parents: 8683
diff changeset
   647
				TileIndex other_end = GetOtherTunnelBridgeEnd(tile);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   648
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   649
				SetRoadTypes(other_end, GetRoadTypes(other_end) | RoadTypeToRoadTypes(rt));
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   650
				SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   651
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   652
				/* Mark tiles diry that have been repaved */
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   653
				MarkTileDirtyByTile(other_end);
7210
508c55fdc09e (svn r9946) -Fix: more places that weren't correctly marked dirty...
rubidium
parents: 7209
diff changeset
   654
				MarkTileDirtyByTile(tile);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   655
				if (IsBridge(tile)) {
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
   656
					TileIndexDiff delta = TileOffsByDiagDir(GetTunnelBridgeDirection(tile));
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   657
7209
52241eea3899 (svn r9945) -Fix: bridges were not properly marked dirty when adding/removing roadtypes.
rubidium
parents: 7207
diff changeset
   658
					for (TileIndex t = tile + delta; t != other_end; t += delta) MarkTileDirtyByTile(t);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   659
				}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   660
			} break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   661
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   662
			case MP_STATION:
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   663
				SetRoadTypes(tile, GetRoadTypes(tile) | RoadTypeToRoadTypes(rt));
10690
2a363031721a (svn r13234) -Fix: Check/affect town rating when removing/bulldozing town-owned road under drivethrough stops.
frosch
parents: 10689
diff changeset
   664
				if (IsDriveThroughStopTile(tile) && rt == ROADTYPE_ROAD) SetStopBuiltOnTownRoad(tile, false);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   665
				break;
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   666
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   667
			default:
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   668
				MakeRoadNormal(tile, pieces, RoadTypeToRoadTypes(rt), p2, _current_player, _current_player, _current_player);
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   669
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   670
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   671
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
   672
		if (rt != ROADTYPE_TRAM && IsNormalRoadTile(tile)) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   673
			existing |= pieces;
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   674
			SetDisallowedRoadDirections(tile, IsStraightRoad(existing) ?
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   675
					GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   676
		}
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   677
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   678
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   679
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   680
	return cost;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   681
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   682
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   683
/** Build a long piece of road.
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: 3435
diff changeset
   684
 * @param end_tile end tile of drag
6979
d194d25020e7 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6923
diff changeset
   685
 * @param flags operation to perform
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   686
 * @param p1 start tile of drag
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   687
 * @param p2 various bitstuffed elements
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   688
 * - p2 = (bit 0) - start tile starts in the 2nd half of tile (p2 & 1)
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   689
 * - p2 = (bit 1) - end tile starts in the 2nd half of tile (p2 & 2)
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   690
 * - p2 = (bit 2) - direction: 0 = along x-axis, 1 = along y-axis (p2 & 4)
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   691
 * - p2 = (bit 3 + 4) - road type
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   692
 * - p2 = (bit 5) - set road direction
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   693
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   694
CommandCost CmdBuildLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   695
{
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   696
	CommandCost cost(EXPENSES_CONSTRUCTION);
7206
e7aad1699f9a (svn r9942) -Fix [FS#804]: crash when upgrading both ends of a bridge.
rubidium
parents: 7198
diff changeset
   697
	bool had_bridge = false;
7924
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   698
	bool had_tunnel = false;
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   699
	bool had_success = false;
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   700
	DisallowedRoadDirections drd = DRD_NORTHBOUND;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   701
9097
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   702
	_error_message = INVALID_STRING_ID;
97f403d00577 (svn r12183) -Codechange: give a better error message when building road over existing road with vehicle on it, or do not fail at all
smatz
parents: 9094
diff changeset
   703
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: 2916
diff changeset
   704
	if (p1 >= MapSize()) return CMD_ERROR;
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   705
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   706
	TileIndex start_tile = p1;
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   707
	RoadType rt = (RoadType)GB(p2, 3, 2);
8353
49a1d9b9d937 (svn r11407) -Fix: do not allow building of tram-tracks when they are not available (SmatZ)
truelight
parents: 8345
diff changeset
   708
	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   709
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   710
	/* Only drag in X or Y direction dictated by the direction variable */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   711
	if (!HasBit(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   712
	if (HasBit(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   713
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   714
	/* Swap start and ending tile, also the half-tile drag var (bit 0 and 1) */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   715
	if (start_tile > end_tile || (start_tile == end_tile && HasBit(p2, 0))) {
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   716
		TileIndex t = start_tile;
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   717
		start_tile = end_tile;
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   718
		end_tile = t;
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8424
diff changeset
   719
		p2 ^= IsInsideMM(p2 & 3, 1, 3) ? 3 : 0;
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   720
		drd = DRD_SOUTHBOUND;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   721
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   722
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   723
	/* On the X-axis, we have to swap the initial bits, so they
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   724
	 * will be interpreted correctly in the GTTS. Futhermore
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   725
	 * when you just 'click' on one tile to build them. */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   726
	if (HasBit(p2, 2) == (start_tile == end_tile && HasBit(p2, 0) == HasBit(p2, 1))) drd ^= DRD_BOTH;
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   727
	/* No disallowed direction bits have to be toggled */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   728
	if (!HasBit(p2, 5)) drd = DRD_NONE;
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   729
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   730
	TileIndex tile = start_tile;
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   731
	/* Start tile is the small number. */
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   732
	for (;;) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   733
		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
3098
4c1320da876d (svn r3687) Complete some bits I missed whenn adding accessor functions for road types and pieces
tron
parents: 3097
diff changeset
   734
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   735
		if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   736
		if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   737
11064
7ebca843450b (svn r13621) -Fix: building roadbits in the wrong direction on bridges or building roadbits from underneath the bridge to the bridgehead is impossible, so don't silently ignore that error when building over houses and industries is not ignored.
rubidium
parents: 10828
diff changeset
   738
		_error_message = INVALID_STRING_ID;
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   739
		CommandCost ret = DoCommand(tile, drd << 6 | rt << 4 | bits, 0, flags, CMD_BUILD_ROAD);
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   740
		if (CmdFailed(ret)) {
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   741
			if (_error_message != STR_1007_ALREADY_BUILT) return CMD_ERROR;
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   742
		} else {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   743
			had_success = true;
7924
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   744
			/* Only pay for the upgrade on one side of the bridges and tunnels */
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   745
			if (IsTileType(tile, MP_TUNNELBRIDGE)) {
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   746
				if (IsBridge(tile)) {
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
   747
					if ((!had_bridge || GetTunnelBridgeDirection(tile) == DIAGDIR_SE || GetTunnelBridgeDirection(tile) == DIAGDIR_SW)) {
7924
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   748
						cost.AddCost(ret);
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   749
					}
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   750
					had_bridge = true;
8886
9f2c7ebc7fc9 (svn r11960) -Cleanup: simplify some IsTunnel(Tile) / IsBridge(Tile) conditions
smatz
parents: 8880
diff changeset
   751
				} else { // IsTunnel(tile)
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8577
diff changeset
   752
					if ((!had_tunnel || GetTunnelBridgeDirection(tile) == DIAGDIR_SE || GetTunnelBridgeDirection(tile) == DIAGDIR_SW)) {
7924
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   753
						cost.AddCost(ret);
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   754
					}
7ceb46058085 (svn r10833) -Fix [FS#1115]: assertion (different cost between test and execution) of overbuilding road tunnels with tram tracks (and vice versa) when the dragged area contains both ends of the tunnel.
rubidium
parents: 7885
diff changeset
   755
					had_tunnel = true;
7206
e7aad1699f9a (svn r9942) -Fix [FS#804]: crash when upgrading both ends of a bridge.
rubidium
parents: 7198
diff changeset
   756
				}
e7aad1699f9a (svn r9942) -Fix [FS#804]: crash when upgrading both ends of a bridge.
rubidium
parents: 7198
diff changeset
   757
			} else {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   758
				cost.AddCost(ret);
7206
e7aad1699f9a (svn r9942) -Fix [FS#804]: crash when upgrading both ends of a bridge.
rubidium
parents: 7198
diff changeset
   759
			}
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   760
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   761
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   762
		if (tile == end_tile) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   763
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   764
		tile += HasBit(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   765
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   766
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
   767
	return !had_success ? CMD_ERROR : cost;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   768
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   769
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   770
/** Remove a long piece of road.
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: 3435
diff changeset
   771
 * @param end_tile end tile of drag
6979
d194d25020e7 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6923
diff changeset
   772
 * @param flags operation to perform
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   773
 * @param p1 start tile of drag
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   774
 * @param p2 various bitstuffed elements
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   775
 * - p2 = (bit 0) - start tile starts in the 2nd half of tile (p2 & 1)
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   776
 * - p2 = (bit 1) - end tile starts in the 2nd half of tile (p2 & 2)
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   777
 * - p2 = (bit 2) - direction: 0 = along x-axis, 1 = along y-axis (p2 & 4)
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   778
 * - p2 = (bit 3 + 4) - road type
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   779
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   780
CommandCost CmdRemoveLongRoad(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   781
{
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   782
	CommandCost cost(EXPENSES_CONSTRUCTION);
889
7f8630bfea41 (svn r1375) -Fix: [1050990] Buying trains sometimes accounted for incorrectly. Was the result of the cost getting reset in a recursive call of docommand. That is fixed. In addition all cost-commands are typed explicitely. Please do not forget to do so or your costs will be credited to construction if you are unlucky.
darkvater
parents: 817
diff changeset
   783
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: 2916
diff changeset
   784
	if (p1 >= MapSize()) return CMD_ERROR;
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   785
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   786
	TileIndex start_tile = p1;
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   787
	RoadType rt = (RoadType)GB(p2, 3, 2);
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   788
	if (!IsValidRoadType(rt)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   789
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   790
	/* Only drag in X or Y direction dictated by the direction variable */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   791
	if (!HasBit(p2, 2) && TileY(start_tile) != TileY(end_tile)) return CMD_ERROR; // x-axis
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   792
	if (HasBit(p2, 2)  && TileX(start_tile) != TileX(end_tile)) return CMD_ERROR; // y-axis
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   793
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   794
	/* Swap start and ending tile, also the half-tile drag var (bit 0 and 1) */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   795
	if (start_tile > end_tile || (start_tile == end_tile && HasBit(p2, 0))) {
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   796
		TileIndex t = start_tile;
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   797
		start_tile = end_tile;
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   798
		end_tile = t;
8450
dce58137301f (svn r11510) -Codechange: merge the IS_*INSIDE* functions and rename them fitting to the naming style
skidd13
parents: 8424
diff changeset
   799
		p2 ^= IsInsideMM(p2 & 3, 1, 3) ? 3 : 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   800
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   801
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   802
	Money money = GetAvailableMoneyForCommand();
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   803
	TileIndex tile = start_tile;
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   804
	/* Start tile is the small number. */
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   805
	for (;;) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   806
		RoadBits bits = HasBit(p2, 2) ? ROAD_Y : ROAD_X;
3098
4c1320da876d (svn r3687) Complete some bits I missed whenn adding accessor functions for road types and pieces
tron
parents: 3097
diff changeset
   807
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   808
		if (tile == end_tile && !HasBit(p2, 1)) bits &= ROAD_NW | ROAD_NE;
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   809
		if (tile == start_tile && HasBit(p2, 0)) bits &= ROAD_SE | ROAD_SW;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   810
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
   811
		/* try to remove the halves. */
3098
4c1320da876d (svn r3687) Complete some bits I missed whenn adding accessor functions for road types and pieces
tron
parents: 3097
diff changeset
   812
		if (bits != 0) {
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   813
			CommandCost ret = RemoveRoad(tile, flags & ~DC_EXEC, bits, rt, true);
7938
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   814
			if (CmdSucceeded(ret)) {
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   815
				if (flags & DC_EXEC) {
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
   816
					money -= ret.GetCost();
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
   817
					if (money < 0) {
7938
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   818
						_additional_cash_required = DoCommand(end_tile, start_tile, p2, flags & ~DC_EXEC, CMD_REMOVE_LONG_ROAD).GetCost();
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   819
						return cost;
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   820
					}
10151
9af8e9f342b7 (svn r12682) -Fix [FS#1920]: removing road pieces from a town gave you twice the intended penalty.
rubidium
parents: 10085
diff changeset
   821
					RemoveRoad(tile, flags, bits, rt, true, false);
7938
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   822
				}
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   823
				cost.AddCost(ret);
ee704bc1c5d3 (svn r10890) -Fix [FS#1125]: removing road with the road removal tool would also work with a negative bank account, making the bank account even more negative than it was.
rubidium
parents: 7924
diff changeset
   824
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   825
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   826
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   827
		if (tile == end_tile) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   828
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   829
		tile += HasBit(p2, 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   830
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   831
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   832
	return (cost.GetCost() == 0) ? CMD_ERROR : cost;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   833
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   834
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   835
/** Build a road 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: 3435
diff changeset
   836
 * @param tile tile where to build the depot
6979
d194d25020e7 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6923
diff changeset
   837
 * @param flags operation to perform
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   838
 * @param p1 bit 0..1 entrance direction (DiagDirection)
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   839
 *           bit 2..3 road type
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   840
 * @param p2 unused
2085
ae9e92ffe168 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2074
diff changeset
   841
 *
ae9e92ffe168 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2074
diff changeset
   842
 * @todo When checking for the tile slope,
ae9e92ffe168 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2074
diff changeset
   843
 * distingush between "Flat land required" and "land sloped in wrong direction"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   844
 */
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   845
CommandCost CmdBuildRoadDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   846
{
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   847
	DiagDirection dir = Extract<DiagDirection, 0>(p1);
7158
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   848
	RoadType rt = (RoadType)GB(p1, 2, 2);
ffb31324aa5e (svn r9893) -Fix (r9892): various small bugs that only act up when using something different than plain roads.
rubidium
parents: 7157
diff changeset
   849
8353
49a1d9b9d937 (svn r11407) -Fix: do not allow building of tram-tracks when they are not available (SmatZ)
truelight
parents: 8345
diff changeset
   850
	if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
1784
6eb3ab1bc33c (svn r2288) - CodeChange: protected the next batch of commands (41 so far, out of 115).
Darkvater
parents: 1638
diff changeset
   851
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   852
	Slope tileh = GetTileSlope(tile, NULL);
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
   853
	if (tileh != SLOPE_FLAT && (
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
   854
				!_settings_game.construction.build_on_slopes ||
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
   855
				IsSteepSlope(tileh) ||
6460
b3017e083031 (svn r8876) -Fix
tron
parents: 6459
diff changeset
   856
				!CanBuildDepotByTileh(dir, tileh)
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   857
			)) {
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
   858
		return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   859
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   860
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   861
	CommandCost cost = 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: 1638
diff changeset
   862
	if (CmdFailed(cost)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   863
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
   864
	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) 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: 5212
diff changeset
   865
10314
9cfcdd5b5ddb (svn r12855) -Codechange: do not use autoptr's for testing whether certain objects can be build, but check it directly in the pool so we do not have to call destructors in the testing phase. Stations still use the autoptr though.
rubidium
parents: 10272
diff changeset
   866
	if (!Depot::CanAllocateItem()) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   867
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   868
	if (flags & DC_EXEC) {
10314
9cfcdd5b5ddb (svn r12855) -Codechange: do not use autoptr's for testing whether certain objects can be build, but check it directly in the pool so we do not have to call destructors in the testing phase. Stations still use the autoptr though.
rubidium
parents: 10272
diff changeset
   869
		Depot *dep = new Depot(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   870
		dep->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   871
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   872
		MakeRoadDepot(tile, _current_player, dir, rt);
3100
552cf19c49cb (svn r3695) Add 2 MarkTileByTile() which I forgot in r3689 (noticed by Belugas)
tron
parents: 3099
diff changeset
   873
		MarkTileDirtyByTile(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   874
	}
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   875
	return cost.AddCost(_price.build_road_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   876
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   877
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   878
static CommandCost RemoveRoadDepot(TileIndex tile, uint32 flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   879
{
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
   880
	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   881
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: 8226
diff changeset
   882
	if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   883
7885
4eb9b01e37ff (svn r10758) -Codechange: make the depot struct use the pool item class as super class.
rubidium
parents: 7866
diff changeset
   884
	if (flags & DC_EXEC) {
4eb9b01e37ff (svn r10758) -Codechange: make the depot struct use the pool item class as super class.
rubidium
parents: 7866
diff changeset
   885
		DoClearSquare(tile);
4eb9b01e37ff (svn r10758) -Codechange: make the depot struct use the pool item class as super class.
rubidium
parents: 7866
diff changeset
   886
		delete GetDepotByTile(tile);
4eb9b01e37ff (svn r10758) -Codechange: make the depot struct use the pool item class as super class.
rubidium
parents: 7866
diff changeset
   887
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   888
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
   889
	return CommandCost(EXPENSES_CONSTRUCTION, _price.remove_road_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   890
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   891
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7353
diff changeset
   892
static CommandCost ClearTile_Road(TileIndex tile, byte flags)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
   893
{
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   894
	switch (GetRoadTileType(tile)) {
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   895
		case ROAD_TILE_NORMAL: {
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
   896
			RoadBits b = GetAllRoadBits(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   897
5888
3117320a611b (svn r8096) -Codechange: Invert the check if you are allowed to clear a road tile so there are not so many negations (too confusing) and added some comments to further clarify what happens.
Darkvater
parents: 5838
diff changeset
   898
			/* Clear the road if only one piece is on the tile OR the AI tries
3117320a611b (svn r8096) -Codechange: Invert the check if you are allowed to clear a road tile so there are not so many negations (too confusing) and added some comments to further clarify what happens.
Darkvater
parents: 5838
diff changeset
   899
			 * to clear town road OR we are not using the DC_AUTO flag */
8328
6909973c8359 (svn r11382) -Codechange: renamed COUNTBITS to CountBits, as it is no longer a macro (skidd13)
truelight
parents: 8315
diff changeset
   900
			if ((CountBits(b) == 1 && GetRoadBits(tile, ROADTYPE_TRAM) == ROAD_NONE) ||
10689
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
   901
			    ((flags & DC_AI_BUILDING) && GetOtherRoadBits(tile, ROADTYPE_ROAD) == ROAD_NONE && IsRoadOwner(tile, ROADTYPE_ROAD, OWNER_TOWN)) ||
5888
3117320a611b (svn r8096) -Codechange: Invert the check if you are allowed to clear a road tile so there are not so many negations (too confusing) and added some comments to further clarify what happens.
Darkvater
parents: 5838
diff changeset
   902
			    !(flags & DC_AUTO)
3117320a611b (svn r8096) -Codechange: Invert the check if you are allowed to clear a road tile so there are not so many negations (too confusing) and added some comments to further clarify what happens.
Darkvater
parents: 5838
diff changeset
   903
				) {
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   904
				RoadTypes rts = GetRoadTypes(tile);
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
   905
				CommandCost ret(EXPENSES_CONSTRUCTION);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   906
				for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   907
					if (HasBit(rts, rt)) {
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   908
						CommandCost tmp_ret = RemoveRoad(tile, flags, GetRoadBits(tile, rt), rt, true);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   909
						if (CmdFailed(tmp_ret)) return tmp_ret;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   910
						ret.AddCost(tmp_ret);
7175
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   911
					}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   912
				}
5afb72652b6d (svn r9910) -Codechange: prepare road building/removing commands for more road types.
rubidium
parents: 7162
diff changeset
   913
				return ret;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   914
			}
5888
3117320a611b (svn r8096) -Codechange: Invert the check if you are allowed to clear a road tile so there are not so many negations (too confusing) and added some comments to further clarify what happens.
Darkvater
parents: 5838
diff changeset
   915
			return_cmd_error(STR_1801_MUST_REMOVE_ROAD_FIRST);
5894
eb5ff472c10f (svn r8102) -Cleanup: Remove unreachable code (r8096), useless cast
Darkvater
parents: 5888
diff changeset
   916
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   917
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   918
		case ROAD_TILE_CROSSING: {
7310
b835c3c702c1 (svn r10053) -Fix: could not clear a level-crossing tile with tram tracks.
rubidium
parents: 7264
diff changeset
   919
			RoadTypes rts = GetRoadTypes(tile);
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
   920
			CommandCost ret(EXPENSES_CONSTRUCTION);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   921
3069
0e6aca11c3da (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents: 3068
diff changeset
   922
			if (flags & DC_AUTO) return_cmd_error(STR_1801_MUST_REMOVE_ROAD_FIRST);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   923
7310
b835c3c702c1 (svn r10053) -Fix: could not clear a level-crossing tile with tram tracks.
rubidium
parents: 7264
diff changeset
   924
			/* Must iterate over the roadtypes in a reverse manner because
b835c3c702c1 (svn r10053) -Fix: could not clear a level-crossing tile with tram tracks.
rubidium
parents: 7264
diff changeset
   925
			 * tram tracks must be removed before the road bits. */
10085
3f6bb14b43c4 (svn r12622) -Fix: infinite loop in case your compiler decides that enums are unsigned by default. Patch by Dominik.
rubidium
parents: 9317
diff changeset
   926
			RoadType rt = ROADTYPE_HWAY;
3f6bb14b43c4 (svn r12622) -Fix: infinite loop in case your compiler decides that enums are unsigned by default. Patch by Dominik.
rubidium
parents: 9317
diff changeset
   927
			do {
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
   928
				if (HasBit(rts, rt)) {
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
   929
					CommandCost tmp_ret = RemoveRoad(tile, flags, GetCrossingRoadBits(tile), rt, false);
7310
b835c3c702c1 (svn r10053) -Fix: could not clear a level-crossing tile with tram tracks.
rubidium
parents: 7264
diff changeset
   930
					if (CmdFailed(tmp_ret)) return tmp_ret;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   931
					ret.AddCost(tmp_ret);
7310
b835c3c702c1 (svn r10053) -Fix: could not clear a level-crossing tile with tram tracks.
rubidium
parents: 7264
diff changeset
   932
				}
10085
3f6bb14b43c4 (svn r12622) -Fix: infinite loop in case your compiler decides that enums are unsigned by default. Patch by Dominik.
rubidium
parents: 9317
diff changeset
   933
			} while (rt-- != ROADTYPE_ROAD);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   934
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   935
			if (flags & DC_EXEC) {
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: 3435
diff changeset
   936
				DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   937
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   938
			return ret;
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   939
		}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   940
3069
0e6aca11c3da (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents: 3068
diff changeset
   941
		default:
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
   942
		case ROAD_TILE_DEPOT:
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   943
			if (flags & DC_AUTO) {
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   944
				return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   945
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
   946
			return RemoveRoadDepot(tile, flags);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   947
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   948
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   949
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   950
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6498
diff changeset
   951
struct DrawRoadTileStruct {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   952
	uint16 image;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   953
	byte subcoord_x;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   954
	byte subcoord_y;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6498
diff changeset
   955
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   956
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   957
#include "table/road_land.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   958
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   959
/**
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   960
 * Get the foundationtype of a RoadBits Slope combination
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   961
 *
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   962
 * @param tileh The Slope part
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   963
 * @param bits The RoadBits part
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   964
 * @return The resulting Foundation
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   965
 */
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
   966
Foundation GetRoadFoundation(Slope tileh, RoadBits bits)
2548
97ada3bd2702 (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   967
{
9230
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   968
	/* Flat land and land without a road doesn't require a foundation */
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   969
	if (tileh == SLOPE_FLAT || bits == ROAD_NONE) return FOUNDATION_NONE;
1c0a7c2ee6e5 (svn r12419) -Cleanup: of the internal road-piece building and removing.
skidd13
parents: 9228
diff changeset
   970
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
   971
	if (!IsSteepSlope(tileh)) {
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   972
		/* Leveled RoadBits on a slope */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   973
		if ((_invalid_tileh_slopes_road[0][tileh] & bits) == ROAD_NONE) return FOUNDATION_LEVELED;
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   974
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   975
		/* Straight roads without foundation on a slope */
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   976
		if (!IsSlopeWithOneCornerRaised(tileh) &&
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   977
				(_invalid_tileh_slopes_road[1][tileh] & bits) == ROAD_NONE)
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   978
			return FOUNDATION_NONE;
4246
14a8849c32df (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4232
diff changeset
   979
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   980
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
   981
	/* Roads on steep Slopes or on Slopes with one corner raised */
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
   982
	return (bits == ROAD_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   983
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   984
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   985
const byte _road_sloped_sprites[14] = {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   986
	0,  0,  2,  0,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   987
	0,  1,  0,  0,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   988
	3,  0,  0,  0,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   989
	0,  0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   990
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   991
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
   992
/**
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   993
 * Whether to draw unpaved roads regardless of the town zone.
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   994
 * By default, OpenTTD always draws roads as unpaved if they are on a desert
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   995
 * tile or above the snowline. Newgrf files, however, can set a bit that allows
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   996
 * paved roads to be built on desert tiles as they would be on grassy tiles.
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   997
 *
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   998
 * @param tile The tile the road is on
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
   999
 * @param roadside What sort of road this is
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1000
 * @return True if the road should be drawn unpaved regardless of the roadside.
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1001
 */
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1002
static bool AlwaysDrawUnpavedRoads(TileIndex tile, Roadside roadside)
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1003
{
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1004
	return (IsOnSnow(tile) &&
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
  1005
			!(_settings_game.game_creation.landscape == LT_TROPIC && HasGrfMiscBit(GMB_DESERT_PAVED_ROADS) &&
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1006
				roadside != ROADSIDE_BARREN && roadside != ROADSIDE_GRASS && roadside != ROADSIDE_GRASS_ROAD_WORKS));
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1007
}
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1008
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1009
/**
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1010
 * Draws the catenary for the given tile
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1011
 * @param ti   information about the tile (slopes, height etc)
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1012
 * @param tram the roadbits for the tram
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1013
 */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1014
void DrawTramCatenary(const TileInfo *ti, RoadBits tram)
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1015
{
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1016
	/* Do not draw catenary if it is invisible */
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1017
	if (IsInvisibilitySet(TO_CATENARY)) return;
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1018
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1019
	/* Don't draw the catenary under a low bridge */
9024
85bc26dd4935 (svn r12103) -Feature(tte): separate catenary transparency settings from building transparency settings
smatz
parents: 9016
diff changeset
  1020
	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && !IsTransparencySet(TO_CATENARY)) {
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1021
		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1022
7195
6edfafb988be (svn r9931) -Fix: some glitches with catenary and bridges.
rubidium
parents: 7193
diff changeset
  1023
		if (height <= GetTileMaxZ(ti->tile) + TILE_HEIGHT) return;
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1024
	}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1025
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1026
	SpriteID front;
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1027
	SpriteID back;
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1028
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1029
	if (ti->tileh != SLOPE_FLAT) {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1030
		back  = SPR_TRAMWAY_BACK_WIRES_SLOPED  + _road_sloped_sprites[ti->tileh - 1];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1031
		front = SPR_TRAMWAY_FRONT_WIRES_SLOPED + _road_sloped_sprites[ti->tileh - 1];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1032
	} else {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1033
		back  = SPR_TRAMWAY_BASE + _road_backpole_sprites_1[tram];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1034
		front = SPR_TRAMWAY_BASE + _road_frontwire_sprites_1[tram];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1035
	}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1036
9024
85bc26dd4935 (svn r12103) -Feature(tte): separate catenary transparency settings from building transparency settings
smatz
parents: 9016
diff changeset
  1037
	AddSortableSpriteToDraw(back,  PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_CATENARY));
85bc26dd4935 (svn r12103) -Feature(tte): separate catenary transparency settings from building transparency settings
smatz
parents: 9016
diff changeset
  1038
	AddSortableSpriteToDraw(front, PAL_NONE, ti->x, ti->y, 16, 16, TILE_HEIGHT + BB_HEIGHT_UNDER_BRIDGE, ti->z, IsTransparencySet(TO_CATENARY));
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1039
}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1040
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1041
/**
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1042
 * Draws details on/around the road
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1043
 * @param img the sprite to draw
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1044
 * @param ti  the tile to draw on
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1045
 * @param dx  the offset from the top of the BB of the tile
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1046
 * @param dy  the offset from the top of the BB of the tile
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1047
 * @param h   the height of the sprite to draw
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1048
 */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1049
static void DrawRoadDetail(SpriteID img, const TileInfo *ti, int dx, int dy, int h)
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1050
{
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1051
	int x = ti->x | dx;
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1052
	int y = ti->y | dy;
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1053
	byte z = ti->z;
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1054
	if (ti->tileh != SLOPE_FLAT) z = GetSlopeZ(x, y);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1055
	AddSortableSpriteToDraw(img, PAL_NONE, x, y, 2, 2, h, z);
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1056
}
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1057
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1058
/**
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1059
 * Draw ground sprite and road pieces
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1060
 * @param ti TileInfo
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1061
 */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1062
static void DrawRoadBits(TileInfo *ti)
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1063
{
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1064
	RoadBits road = GetRoadBits(ti->tile, ROADTYPE_ROAD);
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1065
	RoadBits tram = GetRoadBits(ti->tile, ROADTYPE_TRAM);
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1066
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1067
	SpriteID image = 0;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1068
	SpriteID pal = PAL_NONE;
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1069
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
  1070
	if (ti->tileh != SLOPE_FLAT) {
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
  1071
		DrawFoundation(ti, GetRoadFoundation(ti->tileh, road | tram));
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1072
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1073
		/* DrawFoundation() modifies ti.
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1074
		 * Default sloped sprites.. */
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
  1075
		if (ti->tileh != SLOPE_FLAT) image = _road_sloped_sprites[ti->tileh - 1] + 0x53F;
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1076
	}
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1077
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1078
	if (image == 0) image = _road_tile_sprites_1[road != ROAD_NONE ? road : tram];
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1079
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1080
	Roadside roadside = GetRoadside(ti->tile);
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1081
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1082
	if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1083
		image += 19;
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1084
	} else {
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1085
		switch (roadside) {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1086
			case ROADSIDE_BARREN:           pal = PALETTE_TO_BARE_LAND; break;
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1087
			case ROADSIDE_GRASS:            break;
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1088
			case ROADSIDE_GRASS_ROAD_WORKS: break;
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1089
			default:                        image -= 19; break; // Paved
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1090
		}
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1091
	}
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1092
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1093
	DrawGroundSprite(image, pal);
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1094
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1095
	/* For tram we overlay the road graphics with either tram tracks only
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1096
	 * (when there is actual road beneath the trams) or with tram tracks
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1097
	 * and some dirts which hides the road graphics */
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1098
	if (tram != ROAD_NONE) {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1099
		if (ti->tileh != SLOPE_FLAT) {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1100
			image = _road_sloped_sprites[ti->tileh - 1] + SPR_TRAMWAY_SLOPED_OFFSET;
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1101
		} else {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1102
			image = _road_tile_sprites_1[tram] - SPR_ROAD_Y;
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1103
		}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1104
		image += (road == ROAD_NONE) ? SPR_TRAMWAY_TRAM : SPR_TRAMWAY_OVERLAY;
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1105
		DrawGroundSprite(image, pal);
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1106
	}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1107
7461
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1108
	if (road != ROAD_NONE) {
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1109
		DisallowedRoadDirections drd = GetDisallowedRoadDirections(ti->tile);
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1110
		if (drd != DRD_NONE) {
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1111
			DrawRoadDetail(SPR_ONEWAY_BASE + drd - 1 + ((road == ROAD_X) ? 0 : 3), ti, 8, 8, 0);
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1112
		}
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1113
	}
f9c5dc7f2476 (svn r10221) -Fix: the one way sprites weren't drawn in the correct order, so they could remove the tramtrack in some cases.
rubidium
parents: 7446
diff changeset
  1114
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1115
	if (HasRoadWorks(ti->tile)) {
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1116
		/* Road works */
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1117
		DrawGroundSprite((road | tram) & ROAD_X ? SPR_EXCAVATION_X : SPR_EXCAVATION_Y, PAL_NONE);
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1118
		return;
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1119
	}
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1120
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1121
	if (tram != ROAD_NONE) DrawTramCatenary(ti, tram);
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1122
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1123
	/* Return if full detail is disabled, or we are zoomed fully out. */
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
  1124
	if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return;
5148
00b593a6bae5 (svn r7240) -Fix: Always display the excavation of roadworks even when fully zoomed out (they are quite noticable) or "full details" are off (they are part of the game mechanics)
tron
parents: 5116
diff changeset
  1125
9085
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1126
	/* Do not draw details (street lights, trees) under low bridge */
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1127
	if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile) && (roadside == ROADSIDE_TREES || roadside == ROADSIDE_STREET_LIGHTS)) {
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1128
		uint height = GetBridgeHeight(GetNorthernBridgeEnd(ti->tile));
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1129
		uint minz = GetTileMaxZ(ti->tile) + 2 * TILE_HEIGHT;
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1130
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1131
		if (roadside == ROADSIDE_TREES) minz += TILE_HEIGHT;
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1132
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1133
		if (height < minz) return;
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1134
	}
093e03dad31f (svn r12170) -Fix: do not draw trees along road and street lights under low bridges (spotted by _minime_)
smatz
parents: 9067
diff changeset
  1135
9143
594daafabff4 (svn r12290) -Fix[FS#1807]: Do not draw trees nor lamps between tram tracks.(Roujin)
belugas
parents: 9112
diff changeset
  1136
	/* If there are no road bits, return, as there is nothing left to do */
594daafabff4 (svn r12290) -Fix[FS#1807]: Do not draw trees nor lamps between tram tracks.(Roujin)
belugas
parents: 9112
diff changeset
  1137
	if (CountBits(road) < 2) return;
594daafabff4 (svn r12290) -Fix[FS#1807]: Do not draw trees nor lamps between tram tracks.(Roujin)
belugas
parents: 9112
diff changeset
  1138
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1139
	/* Draw extra details. */
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1140
	for (const DrawRoadTileStruct *drts = _road_display_table[roadside][road | tram]; drts->image != 0; drts++) {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1141
		DrawRoadDetail(drts->image, ti, drts->subcoord_x, drts->subcoord_y, 0x10);
2471
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1142
	}
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1143
}
14109854e818 (svn r2997) -Codechange: Split road drawing code off from DrawTile_Road into a separate function to be used elsewhere.
peter1138
parents: 2469
diff changeset
  1144
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1145
static void DrawTile_Road(TileInfo *ti)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1146
{
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1147
	switch (GetRoadTileType(ti->tile)) {
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1148
		case ROAD_TILE_NORMAL:
4081
8d4111a68f72 (svn r5396) - Remove two fixed parameters
tron
parents: 4077
diff changeset
  1149
			DrawRoadBits(ti);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1150
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1151
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1152
		case ROAD_TILE_CROSSING: {
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
  1153
			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1154
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1155
			SpriteID image = GetRailTypeInfo(GetRailType(ti->tile))->base_sprites.crossing;
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1156
			SpriteID pal = PAL_NONE;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1157
3272
7e556f209503 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3269
diff changeset
  1158
			if (GetCrossingRoadAxis(ti->tile) == AXIS_X) image++;
3322
fa5d46929db9 (svn r4088) -Codechange: Introduce {Unb,B}arCrossing and IsCrossingBarred to put and get the status of a level crossing
celestar
parents: 3319
diff changeset
  1159
			if (IsCrossingBarred(ti->tile)) image += 2;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1160
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1161
			Roadside roadside = GetRoadside(ti->tile);
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1162
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1163
			if (AlwaysDrawUnpavedRoads(ti->tile, roadside)) {
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1164
				image += 8;
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1165
			} else {
7037
3cd1bd7a6edb (svn r9730) -Feature: [NewGRF] Add support for miscellaneous grf feature bit 1 - paved roads on desert tiles.
maedhros
parents: 6987
diff changeset
  1166
				switch (roadside) {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1167
					case ROADSIDE_BARREN: pal = PALETTE_TO_BARE_LAND; break;
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1168
					case ROADSIDE_GRASS:  break;
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1169
					default:              image += 4; break; // Paved
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1170
				}
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1171
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1172
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1173
			DrawGroundSprite(image, pal);
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1174
			if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) {
7193
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
  1175
				DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
  1176
				DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
e0cdd5c824dd (svn r9929) -Fix [FS#803]: fix several drawing issues.
rubidium
parents: 7187
diff changeset
  1177
			}
10473
ad730880e443 (svn r13016) -Codechange: unify the detection if rail catenary should be drawn
smatz
parents: 10429
diff changeset
  1178
			if (HasCatenaryDrawn(GetRailType(ti->tile))) DrawCatenary(ti);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1179
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1180
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1181
3098
4c1320da876d (svn r3687) Complete some bits I missed whenn adding accessor functions for road types and pieces
tron
parents: 3097
diff changeset
  1182
		default:
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1183
		case ROAD_TILE_DEPOT: {
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
  1184
			if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, FOUNDATION_LEVELED);
1398
2299b334e660 (svn r1902) Replace some casts with proper typing
tron
parents: 1359
diff changeset
  1185
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1186
			SpriteID palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1187
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1188
			const DrawTileSprites *dts;
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1189
			if (HasTileRoadType(ti->tile, ROADTYPE_TRAM)) {
7187
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1190
				dts =  &_tram_depot[GetRoadDepotDirection(ti->tile)];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1191
			} else {
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1192
				dts =  &_road_depot[GetRoadDepotDirection(ti->tile)];
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1193
			}
f7dc3204d457 (svn r9923) -Add: support for Action 0 Road vehicles, property 1C, bit 0.
rubidium
parents: 7185
diff changeset
  1194
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  1195
			DrawGroundSprite(dts->ground.sprite, PAL_NONE);
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1196
9302
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1197
			/* End now if buildings are invisible */
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1198
			if (IsInvisibilitySet(TO_BUILDINGS)) break;
4aa3c4a44b16 (svn r12547) -Feature: invisibility options to make objects invisible instead of transparent
smatz
parents: 9243
diff changeset
  1199
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1200
			for (const DrawTileSeqStruct *dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9059
diff changeset
  1201
				SpriteID image = dtss->image.sprite;
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1202
				SpriteID pal;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1203
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
  1204
				if (!IsTransparencySet(TO_BUILDINGS) && HasBit(image, PALETTE_MODIFIER_COLOR)) {
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1205
					pal = palette;
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1206
				} else {
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1207
					pal = PAL_NONE;
4226
3926da9dc486 (svn r5772) Road depots always have an player as owner, so remove an useless check
tron
parents: 4212
diff changeset
  1208
				}
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1209
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4048
diff changeset
  1210
				AddSortableSpriteToDraw(
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1211
					image, pal,
4232
628628eaa4fc (svn r5796) Use DrawTileSprites/DrawTileSeqStruct for road depot drawing data, too
tron
parents: 4231
diff changeset
  1212
					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
628628eaa4fc (svn r5796) Use DrawTileSprites/DrawTileSeqStruct for road depot drawing data, too
tron
parents: 4231
diff changeset
  1213
					dtss->size_x, dtss->size_y,
7829
88883899c9e6 (svn r10696) -Codechange: remove duplication of the "make sprite transparent" code.
rubidium
parents: 7828
diff changeset
  1214
					dtss->size_z, ti->z,
8345
6caa3fdb972c (svn r11399) -Feature(ette): transparency settings can now be saved and thus remembered.
belugas
parents: 8328
diff changeset
  1215
					IsTransparencySet(TO_BUILDINGS)
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1216
				);
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1217
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1218
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1219
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1220
	}
5573
afa6f92a71fd (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5212
diff changeset
  1221
	DrawBridgeMiddle(ti);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1222
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1223
7162
b769c2b45103 (svn r9897) -Codechange: prepare the toolbar for more road types.
rubidium
parents: 7158
diff changeset
  1224
void DrawRoadDepotSprite(int x, int y, DiagDirection dir, RoadType rt)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1225
{
5919
2b58160d667d (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5894
diff changeset
  1226
	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1227
	const DrawTileSprites *dts = (rt == ROADTYPE_TRAM) ? &_tram_depot[dir] : &_road_depot[dir];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1228
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
  1229
	x += 33;
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
  1230
	y += 17;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1231
9067
88f2bc991236 (svn r12149) -Codechange: Merge 'ground_sprite' and 'ground_pal' of DrawTileSprites into one PalSpriteID
frosch
parents: 9066
diff changeset
  1232
	DrawSprite(dts->ground.sprite, PAL_NONE, x, y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1233
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1234
	for (const DrawTileSeqStruct *dtss = dts->seq; dtss->image.sprite != 0; dtss++) {
4232
628628eaa4fc (svn r5796) Use DrawTileSprites/DrawTileSeqStruct for road depot drawing data, too
tron
parents: 4231
diff changeset
  1235
		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
9066
29d5a0dfc329 (svn r12148) -Codechange: Merge 'image' and 'pal' of DrawTileSeqStruct into one PalSpriteID
frosch
parents: 9059
diff changeset
  1236
		SpriteID image = dtss->image.sprite;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1237
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8353
diff changeset
  1238
		DrawSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1239
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1240
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1241
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4226
diff changeset
  1242
static uint GetSlopeZ_Road(TileIndex tile, uint x, uint y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1243
{
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4226
diff changeset
  1244
	uint z;
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4226
diff changeset
  1245
	Slope tileh = GetTileSlope(tile, &z);
3098
4c1320da876d (svn r3687) Complete some bits I missed whenn adding accessor functions for road types and pieces
tron
parents: 3097
diff changeset
  1246
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3560
diff changeset
  1247
	if (tileh == SLOPE_FLAT) return z;
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1248
	if (IsNormalRoad(tile)) {
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
  1249
		Foundation f = GetRoadFoundation(tileh, GetAllRoadBits(tile));
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
  1250
		z += ApplyFoundationToSlope(f, &tileh);
4231
dea6a63dd058 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4226
diff changeset
  1251
		return z + GetPartialZ(x & 0xF, y & 0xF, tileh);
3286
3250f1488eb2 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3277
diff changeset
  1252
	} else {
3645
86af43f87885 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3637
diff changeset
  1253
		return z + TILE_HEIGHT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1254
	}
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1255
}
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1256
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
  1257
static Foundation GetFoundation_Road(TileIndex tile, Slope tileh)
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1258
{
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1259
	if (IsNormalRoad(tile)) {
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
  1260
		return GetRoadFoundation(tileh, GetAllRoadBits(tile));
3286
3250f1488eb2 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3277
diff changeset
  1261
	} else {
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
  1262
		return FlatteningFoundation(tileh);
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1263
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1264
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1266
static void GetAcceptedCargo_Road(TileIndex tile, AcceptedCargo ac)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1267
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1268
	/* not used */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1270
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1271
static void AnimateTile_Road(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1272
{
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
  1273
	if (IsLevelCrossing(tile)) MarkTileDirtyByTile(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1274
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1275
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1276
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1277
static const Roadside _town_road_types[][2] = {
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1278
	{ ROADSIDE_GRASS,         ROADSIDE_GRASS },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1279
	{ ROADSIDE_PAVED,         ROADSIDE_PAVED },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1280
	{ ROADSIDE_PAVED,         ROADSIDE_PAVED },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1281
	{ ROADSIDE_TREES,         ROADSIDE_TREES },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1282
	{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED }
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1283
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1285
static const Roadside _town_road_types_2[][2] = {
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1286
	{ ROADSIDE_GRASS,         ROADSIDE_GRASS },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1287
	{ ROADSIDE_PAVED,         ROADSIDE_PAVED },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1288
	{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1289
	{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED },
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1290
	{ ROADSIDE_STREET_LIGHTS, ROADSIDE_PAVED }
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1291
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1292
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1293
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1294
static void TileLoop_Road(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1295
{
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
  1296
	switch (_settings_game.game_creation.landscape) {
6683
7ec558346172 (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6669
diff changeset
  1297
		case LT_ARCTIC:
6669
487ac09b95c4 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6585
diff changeset
  1298
			if (IsOnSnow(tile) != (GetTileZ(tile) > GetSnowLine())) {
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1299
				ToggleSnow(tile);
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
  1300
				MarkTileDirtyByTile(tile);
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
  1301
			}
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
  1302
			break;
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
  1303
6683
7ec558346172 (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6669
diff changeset
  1304
		case LT_TROPIC:
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1305
			if (GetTropicZone(tile) == TROPICZONE_DESERT && !IsOnDesert(tile)) {
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1306
				ToggleDesert(tile);
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
  1307
				MarkTileDirtyByTile(tile);
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
  1308
			}
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
  1309
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1310
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1311
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1312
	if (IsRoadDepot(tile)) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1313
9317
191b8b10e545 (svn r12569) -Cleanup: variable scope and coding style in road*.cpp
smatz
parents: 9302
diff changeset
  1314
	const Town *t = ClosestTownFromTile(tile, (uint)-1);
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1315
	if (!HasRoadWorks(tile)) {
8804
6d7e8b85529e (svn r11873) -Codechange: less a few magical numbers and a tiny bit more comments on town zones
belugas
parents: 8760
diff changeset
  1316
		HouseZonesBits grp = HZB_TOWN_EDGE;
1280
b6925875de49 (svn r1784) -Fix: removed ClosestTownFromTile where possible, or replaced it
truelight
parents: 1264
diff changeset
  1317
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1318
		if (t != NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1319
			grp = GetTownRadiusGroup(t, tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1320
6889
f7f6d9cb07a0 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6694
diff changeset
  1321
			/* Show an animation to indicate road work */
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1322
			if (t->road_build_months != 0 &&
8804
6d7e8b85529e (svn r11873) -Codechange: less a few magical numbers and a tiny bit more comments on town zones
belugas
parents: 8760
diff changeset
  1323
					(DistanceManhattan(t->xy, tile) < 8 || grp != HZB_TOWN_EDGE) &&
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1324
					IsNormalRoad(tile) && CountBits(GetAllRoadBits(tile)) > 1 ) {
8463
3920ac0ab803 (svn r11523) -Codechange: Move the CHANCE macros to core/random_func.cpp cause they depend on Random()
skidd13
parents: 8450
diff changeset
  1325
				if (GetTileSlope(tile, NULL) == SLOPE_FLAT && EnsureNoVehicleOnGround(tile) && Chance16(1, 40)) {
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1326
					StartRoadWorks(tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1327
541
e1cd34389f79 (svn r925) Use sound enums
tron
parents: 534
diff changeset
  1328
					SndPlayTileFx(SND_21_JACKHAMMER, tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1329
					CreateEffectVehicleAbove(
3421
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3418
diff changeset
  1330
						TileX(tile) * TILE_SIZE + 7,
8ab76c47c72c (svn r4246) -Codechange. Replaced about 100 occurences of '16' by TILE_SIZE
celestar
parents: 3418
diff changeset
  1331
						TileY(tile) * TILE_SIZE + 7,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1332
						0,
1359
8ba976aed634 (svn r1863) Give the effect vehicle type enums more descriptive names and use the enum as parameter type for CreateEffectVehicle*()
tron
parents: 1327
diff changeset
  1333
						EV_BULLDOZER);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1334
					MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1335
					return;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1336
				}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1337
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1338
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1339
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1340
		{
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1341
			/* Adjust road ground type depending on 'grp' (grp is the distance to the center) */
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
  1342
			const Roadside* new_rs = (_settings_game.game_creation.landscape == LT_TOYLAND) ? _town_road_types_2[grp] : _town_road_types[grp];
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1343
			Roadside cur_rs = GetRoadside(tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1344
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1345
			/* We have our desired type, do nothing */
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1346
			if (cur_rs == new_rs[0]) return;
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1347
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1348
			/* We have the pre-type of the desired type, switch to the desired type */
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1349
			if (cur_rs == new_rs[1]) {
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1350
				cur_rs = new_rs[0];
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1351
			/* We have barren land, install the pre-type */
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1352
			} else if (cur_rs == ROADSIDE_BARREN) {
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1353
				cur_rs = new_rs[1];
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1354
			/* We're totally off limits, remove any installation and make barren land */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1355
			} else {
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1356
				cur_rs = ROADSIDE_BARREN;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1357
			}
4048
e773f441eb4f (svn r5317) s/RGT_/ROADSIDE_/ and some minor changes
tron
parents: 4046
diff changeset
  1358
			SetRoadside(tile, cur_rs);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1359
			MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1360
		}
3430
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1361
	} else if (IncreaseRoadWorksCounter(tile)) {
b283bb956a36 (svn r4258) -Codechange: Add and make use of map accessors dealing with road ground types (including roadworks).
celestar
parents: 3421
diff changeset
  1362
		TerminateRoadWorks(tile);
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1363
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
  1364
		if (_settings_game.economy.mod_road_rebuild) {
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1365
			/* Generate a nicer town surface */
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1366
			const RoadBits old_rb = GetAnyRoadBits(tile, ROADTYPE_ROAD);
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1367
			const RoadBits new_rb = CleanUpRoadBits(tile, old_rb);
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1368
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1369
			if (old_rb != new_rb) {
8924
7a7d228298fe (svn r11998) -Fix [FS#1692](r10053): possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD
smatz
parents: 8909
diff changeset
  1370
				RemoveRoad(tile, DC_EXEC | DC_AUTO | DC_NO_WATER, (old_rb ^ new_rb), ROADTYPE_ROAD, true);
8137
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1371
			}
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1372
		}
67a9579abd74 (svn r11172) -Codechange: rewrite of town road building and addition of the possibility to clean up unconnected road bits during the local road reconstructions. Based on a patch by skidd13.
rubidium
parents: 8097
diff changeset
  1373
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1374
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1375
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1376
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1377
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1378
static void ClickTile_Road(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1379
{
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1380
	if (IsRoadDepot(tile)) ShowDepotWindow(tile, VEH_ROAD);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1381
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1382
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1383
/* Converts RoadBits to TrackBits */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1384
static const byte _road_trackbits[16] = {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1385
	0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1386
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1387
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1388
static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1389
{
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1390
	TrackdirBits trackdirbits = TRACKDIR_BIT_NONE;
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1391
	TrackdirBits red_signals = TRACKDIR_BIT_NONE; // crossing barred
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1392
	switch (mode) {
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1393
		case TRANSPORT_RAIL:
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1394
			if (IsLevelCrossing(tile)) trackdirbits = TrackBitsToTrackdirBits(GetCrossingRailBits(tile));
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1395
			break;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1396
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1397
		case TRANSPORT_ROAD:
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1398
			if ((GetRoadTypes(tile) & sub_mode) == 0) break;
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1399
			switch (GetRoadTileType(tile)) {
7179
3e123c2b7c93 (svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents: 7175
diff changeset
  1400
				case ROAD_TILE_NORMAL: {
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1401
					const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 };
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1402
					RoadType rt = (RoadType)FindFirstBit(sub_mode);
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1403
					RoadBits bits = GetRoadBits(tile, rt);
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1404
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1405
					/* no roadbit at this side of tile, return 0 */
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1406
					if (side != INVALID_DIAGDIR && (DiagDirToRoadBits(side) & bits) == 0) break;
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1407
7260
23cd58b6bf51 (svn r9999) -Feature: make it possible to disallow busses and lorries to go a specific way on straight pieces of road.
rubidium
parents: 7257
diff changeset
  1408
					uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)];
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1409
					if (!HasRoadWorks(tile)) trackdirbits = (TrackdirBits)(_road_trackbits[bits] * multiplier);
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1410
					break;
7179
3e123c2b7c93 (svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents: 7175
diff changeset
  1411
				}
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1412
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1413
				case ROAD_TILE_CROSSING: {
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1414
					Axis axis = GetCrossingRoadAxis(tile);
3272
7e556f209503 (svn r3984) Add a function to get the road axis of a level crossing
tron
parents: 3269
diff changeset
  1415
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1416
					if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break;
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1417
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1418
					trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis));
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1419
					if (IsCrossingBarred(tile)) red_signals = trackdirbits;
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1420
					break;
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1421
				}
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1422
3069
0e6aca11c3da (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents: 3068
diff changeset
  1423
				default:
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1424
				case ROAD_TILE_DEPOT: {
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1425
					DiagDirection dir = GetRoadDepotDirection(tile);
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1426
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1427
					if (side != INVALID_DIAGDIR && side != dir) break;
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1428
10546
07ab34af246e (svn r13090) -Codechange: add functions for direct conversion from DiagDirection to Track and Trackbits
smatz
parents: 10473
diff changeset
  1429
					trackdirbits = TrackBitsToTrackdirBits(DiagDirToDiagTrackBits(dir));
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1430
					break;
9092
383a632de666 (svn r12177) -Codechange: use 'side' parameter in GetTileTrackStatus so there can be less checks in pathfinders for depots/stations/tunnels/bridges
smatz
parents: 9085
diff changeset
  1431
				}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1432
			}
3066
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1433
			break;
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1434
0d34dff23d98 (svn r3655) Simplify a boolean expression and turn 3 if-cascades into switches
tron
parents: 3061
diff changeset
  1435
		default: break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1436
	}
9112
ec6800eaa340 (svn r12199) -Codechange: Remove magic around the results of GetTileTrackStatus().
frosch
parents: 9099
diff changeset
  1437
	return CombineTrackStatus(trackdirbits, red_signals);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1438
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1439
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1440
static const StringID _road_tile_strings[] = {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1441
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1442
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1443
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1444
	STR_1815_ROAD_WITH_STREETLIGHTS,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1445
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1446
	STR_1816_TREE_LINED_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1447
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1448
	STR_1814_ROAD,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1449
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1450
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1942
diff changeset
  1451
static void GetTileDesc_Road(TileIndex tile, TileDesc *td)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1452
{
10662
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1453
	Owner rail_owner = INVALID_OWNER;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1454
	Owner road_owner = INVALID_OWNER;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1455
	Owner tram_owner = INVALID_OWNER;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1456
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1457
	switch (GetRoadTileType(tile)) {
10662
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1458
		case ROAD_TILE_CROSSING: {
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1459
			td->str = STR_1818_ROAD_RAIL_LEVEL_CROSSING;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1460
			RoadTypes rts = GetRoadTypes(tile);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1461
			rail_owner = GetTileOwner(tile);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1462
			if (HasBit(rts, ROADTYPE_ROAD)) road_owner = GetRoadOwner(tile, ROADTYPE_ROAD);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1463
			if (HasBit(rts, ROADTYPE_TRAM)) tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1464
			break;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1465
		}
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1466
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1467
		case ROAD_TILE_DEPOT:
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1468
			td->str = STR_1817_ROAD_VEHICLE_DEPOT;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1469
			road_owner = GetTileOwner(tile); // Tile has only one owner, roadtype does not matter
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1470
			break;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1471
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1472
		default: {
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1473
			RoadTypes rts = GetRoadTypes(tile);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1474
			td->str = (HasBit(rts, ROADTYPE_ROAD) ? _road_tile_strings[GetRoadside(tile)] : STR_TRAMWAY);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1475
			if (HasBit(rts, ROADTYPE_ROAD)) road_owner = GetRoadOwner(tile, ROADTYPE_ROAD);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1476
			if (HasBit(rts, ROADTYPE_TRAM)) tram_owner = GetRoadOwner(tile, ROADTYPE_TRAM);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1477
			break;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1478
		}
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1479
	}
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1480
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1481
	/* Now we have to discover, if the tile has only one owner or many:
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1482
	 *   - Find a first_owner of the tile. (Currently road or tram must be present, but this will break when the third type becomes available)
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1483
	 *   - Compare the found owner with the other owners, and test if they differ.
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1484
	 * Note: If road exists it will be the first_owner.
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1485
	 */
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1486
	Owner first_owner = (road_owner == INVALID_OWNER ? tram_owner : road_owner);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1487
	bool mixed_owners = (tram_owner != INVALID_OWNER && tram_owner != first_owner) || (rail_owner != INVALID_OWNER && rail_owner != first_owner);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1488
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1489
	if (mixed_owners) {
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1490
		/* Multiple owners */
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1491
		td->owner_type[0] = (rail_owner == INVALID_OWNER ? STR_NULL : STR_RAIL_OWNER);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1492
		td->owner[0] = rail_owner;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1493
		td->owner_type[1] = (road_owner == INVALID_OWNER ? STR_NULL : STR_ROAD_OWNER);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1494
		td->owner[1] = road_owner;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1495
		td->owner_type[2] = (tram_owner == INVALID_OWNER ? STR_NULL : STR_TRAM_OWNER);
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1496
		td->owner[2] = tram_owner;
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1497
	} else {
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1498
		/* One to rule them all */
f455941692a3 (svn r13206) -Feature(ette): Display all owners of a tile in the tile-info-window.
frosch
parents: 10622
diff changeset
  1499
		td->owner[0] = first_owner;
3069
0e6aca11c3da (svn r3658) Add functions and symbolic names to retrieve road tile types and road pieces
tron
parents: 3068
diff changeset
  1500
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1501
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1502
7219
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1503
/**
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1504
 * Given the direction the road depot is pointing, this is the direction the
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1505
 * vehicle should be travelling in in order to enter the depot.
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1506
 */
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1507
static const byte _roadveh_enter_depot_dir[4] = {
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1508
	TRACKDIR_X_SW, TRACKDIR_Y_NW, TRACKDIR_X_NE, TRACKDIR_Y_SE
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1509
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1510
8615
6b91ca653bad (svn r11680) -Codechange: refactor more out of openttd.h and functions.h.
rubidium
parents: 8612
diff changeset
  1511
static VehicleEnterTileStatus VehicleEnter_Road(Vehicle *v, TileIndex tile, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1512
{
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1513
	switch (GetRoadTileType(tile)) {
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1514
		case ROAD_TILE_CROSSING:
8838
1549b7f9d0a8 (svn r11908) -Fix: update crossing when merging a company, when building a crossing and after loading older savegame
smatz
parents: 8804
diff changeset
  1515
			if (v->type == VEH_TRAIN) {
1549b7f9d0a8 (svn r11908) -Fix: update crossing when merging a company, when building a crossing and after loading older savegame
smatz
parents: 8804
diff changeset
  1516
				/* it should be barred */
1549b7f9d0a8 (svn r11908) -Fix: update crossing when merging a company, when building a crossing and after loading older savegame
smatz
parents: 8804
diff changeset
  1517
				assert(IsCrossingBarred(tile));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1518
			}
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1519
			break;
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1520
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3792
diff changeset
  1521
		case ROAD_TILE_DEPOT:
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6582
diff changeset
  1522
			if (v->type == VEH_ROAD &&
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4048
diff changeset
  1523
					v->u.road.frame == 11 &&
7219
e5b7a61ea70f (svn r9955) -Codechange: Make _roadveh_enter_depot_unk0 slightly less mysterious.
maedhros
parents: 7215
diff changeset
  1524
					_roadveh_enter_depot_dir[GetRoadDepotDirection(tile)] == v->u.road.state) {
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1525
				v->u.road.state = RVSB_IN_DEPOT;
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1526
				v->vehstatus |= VS_HIDDEN;
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1527
				v->direction = ReverseDir(v->direction);
7988
6075538f6111 (svn r11003) -Codechange: replace Vehicle->next to Vehicle->Next() and Vehicle->SetNext() so we can trap instances that change a next pointer and (in the future) update the first/previous pointers based on that.
rubidium
parents: 7938
diff changeset
  1528
				if (v->Next() == NULL) VehicleEnterDepot(v);
7353
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1529
				v->tile = tile;
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1530
716c6dd9322a (svn r10097) -Feature: Add support for articulated road vehicles, or callbacks 11 and 17 for
maedhros
parents: 7310
diff changeset
  1531
				InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
6317
c73bda71ac16 (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 6193
diff changeset
  1532
				return VETSB_ENTERED_WORMHOLE;
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1533
			}
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1534
			break;
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1535
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1536
		default: break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1537
	}
6317
c73bda71ac16 (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 6193
diff changeset
  1538
	return VETSB_CONTINUE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1539
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1540
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1541
2436
177cb6a8339f (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1542
static void ChangeTileOwner_Road(TileIndex tile, PlayerID old_player, PlayerID new_player)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1543
{
9059
04edde3eb0c6 (svn r12141) -Codechange: Introduce IsNormalRoad[Tile](), IsRoadDepot[Tile]() and HasTileRoadType(); and use them.
frosch
parents: 9056
diff changeset
  1544
	if (IsRoadDepot(tile)) {
7213
9e17eef904cb (svn r9949) -Fix: (road) depots got deowned on bankrupts.
rubidium
parents: 7212
diff changeset
  1545
		if (GetTileOwner(tile) == old_player) {
9e17eef904cb (svn r9949) -Fix: (road) depots got deowned on bankrupts.
rubidium
parents: 7212
diff changeset
  1546
			if (new_player == PLAYER_SPECTATOR) {
9015
4a44c6974ac1 (svn r12094) -Codechange: use DC_BANKRUPT command flag when removing player property to allow further fixes
smatz
parents: 8924
diff changeset
  1547
				DoCommand(tile, 0, 0, DC_EXEC | DC_BANKRUPT, CMD_LANDSCAPE_CLEAR);
7213
9e17eef904cb (svn r9949) -Fix: (road) depots got deowned on bankrupts.
rubidium
parents: 7212
diff changeset
  1548
			} else {
9e17eef904cb (svn r9949) -Fix: (road) depots got deowned on bankrupts.
rubidium
parents: 7212
diff changeset
  1549
				SetTileOwner(tile, new_player);
9e17eef904cb (svn r9949) -Fix: (road) depots got deowned on bankrupts.
rubidium
parents: 7212
diff changeset
  1550
			}
7185
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1551
		}
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1552
		return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1553
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1554
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1555
	for (RoadType rt = ROADTYPE_ROAD; rt < ROADTYPE_END; rt++) {
10689
46a1a76e734e (svn r13233) -Fix: Replace some (incorrect) evaluations of TileOwner by RoadOwner.
frosch
parents: 10662
diff changeset
  1556
		/* Update all roadtypes, no matter if they are present */
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1557
		if (GetRoadOwner(tile, rt) == old_player) {
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1558
			SetRoadOwner(tile, rt, new_player == PLAYER_SPECTATOR ? OWNER_NONE : new_player);
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1559
		}
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1560
	}
3060
187ddce152fe (svn r3649) Turn several if-cascades into switch()es
tron
parents: 3055
diff changeset
  1561
7157
270bc5b64e08 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 7122
diff changeset
  1562
	if (IsLevelCrossing(tile)) {
7185
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1563
		if (GetTileOwner(tile) == old_player) {
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1564
			if (new_player == PLAYER_SPECTATOR) {
9094
58d1cddf1af6 (svn r12179) -Codechange: use GetCrossingRailTrack() and GetCrossingRailAxis() to improve code readability
smatz
parents: 9092
diff changeset
  1565
				DoCommand(tile, 0, GetCrossingRailTrack(tile), DC_EXEC | DC_BANKRUPT, CMD_REMOVE_SINGLE_RAIL);
7185
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1566
			} else {
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1567
				SetTileOwner(tile, new_player);
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1568
			}
1fbb1d9d34d1 (svn r9921) -Fix (r9892): ownership wasn't properly propagated on owner changes.
rubidium
parents: 7179
diff changeset
  1569
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1570
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1571
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1572
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7988
diff changeset
  1573
static CommandCost TerraformTile_Road(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: 7988
diff changeset
  1574
{
10775
7061477bfbcf (svn r13325) -Codechange: split the client-side only settings from the settings stored in the savegame so there is no need to have a duplicate copy of it for new games.
rubidium
parents: 10707
diff changeset
  1575
	if (_settings_game.construction.build_on_slopes && AutoslopeEnabled()) {
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1576
		switch (GetRoadTileType(tile)) {
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1577
			case ROAD_TILE_CROSSING:
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
  1578
				if (!IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new)) && HasBit(VALID_LEVEL_CROSSING_SLOPES, tileh_new)) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1579
				break;
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1580
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1581
			case ROAD_TILE_DEPOT:
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
  1582
				if (AutoslopeCheckForEntranceEdge(tile, z_new, tileh_new, GetRoadDepotDirection(tile))) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1583
				break;
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1584
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1585
			case ROAD_TILE_NORMAL: {
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1586
				RoadBits bits = GetAllRoadBits(tile);
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1587
				RoadBits bits_copy = bits;
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1588
				/* Check if the slope-road_bits combination is valid at all, i.e. it is save to call GetRoadFoundation(). */
9240
5f32884581e6 (svn r12440) -Fix [FS#1694]: Make the road building and road removing conditions more union
skidd13
parents: 9230
diff changeset
  1589
				if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE, ROAD_NONE))) {
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1590
					/* CheckRoadSlope() sometimes changes the road_bits, if it does not agree with them. */
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1591
					if (bits == bits_copy) {
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1592
						uint z_old;
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1593
						Slope tileh_old = GetTileSlope(tile, &z_old);
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1594
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1595
						/* Get the slope on top of the foundation */
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1596
						z_old += ApplyFoundationToSlope(GetRoadFoundation(tileh_old, bits), &tileh_old);
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1597
						z_new += ApplyFoundationToSlope(GetRoadFoundation(tileh_new, bits), &tileh_new);
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1598
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1599
						/* The surface slope must not be changed */
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
  1600
						if ((z_old == z_new) && (tileh_old == tileh_new)) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
8078
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1601
					}
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1602
				}
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1603
				break;
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1604
			}
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1605
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1606
			default: NOT_REACHED();
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1607
		}
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1608
	}
bdf94bf88568 (svn r11107) -Feature: some tool so one can still build tunnels under rails (and other structures) when the owner of the structure built it on foundations and if you have enough "empty" space ofcourse. One could use the tool for some other construction needs too. Patch by frosch.
rubidium
parents: 8035
diff changeset
  1609
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7988
diff changeset
  1610
	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: 7988
diff changeset
  1611
}
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7988
diff changeset
  1612
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1613
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
  1614
extern const TileTypeProcs _tile_type_road_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: 4246
diff changeset
  1615
	DrawTile_Road,           /* 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: 4246
diff changeset
  1616
	GetSlopeZ_Road,          /* 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: 4246
diff changeset
  1617
	ClearTile_Road,          /* 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: 4246
diff changeset
  1618
	GetAcceptedCargo_Road,   /* 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: 4246
diff changeset
  1619
	GetTileDesc_Road,        /* 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: 4246
diff changeset
  1620
	GetTileTrackStatus_Road, /* 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: 4246
diff changeset
  1621
	ClickTile_Road,          /* 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: 4246
diff changeset
  1622
	AnimateTile_Road,        /* 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: 4246
diff changeset
  1623
	TileLoop_Road,           /* 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: 4246
diff changeset
  1624
	ChangeTileOwner_Road,    /* 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: 4246
diff changeset
  1625
	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: 4246
diff changeset
  1626
	VehicleEnter_Road,       /* 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
  1627
	GetFoundation_Road,      /* get_foundation_proc */
7990
70039e33e893 (svn r11005) -Codechange: move the tiletype specific terraforming checks to the functions for those tile types.
rubidium
parents: 7988
diff changeset
  1628
	TerraformTile_Road,      /* terraform_tile_proc */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1629
};