src/rail_cmd.cpp
author truelight
Mon, 23 Jul 2007 16:39:27 +0000
changeset 7310 eed5036fee1f
parent 7307 9f8922176b67
child 7333 e48228e44be8
permissions -rw-r--r--
(svn r10662) -Add: added 'V' as new shortcut for new viewport (bilbo)
-Add: added 'M' as new shortcut for smallmap (bilbo)
-Add: added '+' and '-' as shortcuts to zoom in the mainview (bilbo)
-Add: added support for other keycodes to be possible used in the future (bilbo)
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6393
e1e4939d19b5 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6368
diff changeset
     3
/** @file rail_cmd.cpp */
e1e4939d19b5 (svn r9523) -Cleanup: doxygen changes. Time to take care of "R"
belugas
parents: 6368
diff changeset
     4
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
     5
#include "stdafx.h"
1891
862800791170 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1818
diff changeset
     6
#include "openttd.h"
3189
bf047128dee7 (svn r3846) Add functions to set the type of stuff (clear, water, rail, road) under bridges
tron
parents: 3185
diff changeset
     7
#include "bridge_map.h"
6160
fa42299e967e (svn r8908) -Codechange: declaration of DrawBridgeMiddle does not belong in a map accessors header.
rubidium
parents: 6134
diff changeset
     8
#include "bridge.h"
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
     9
#include "cmd_helper.h"
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
    10
#include "debug.h"
2163
b17b313113a0 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2148
diff changeset
    11
#include "functions.h"
3101
a44fdf9faef1 (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: 3099
diff changeset
    12
#include "rail_map.h"
3144
33e42feae531 (svn r3763) Adapt to the new 'map accessors go in foo_map.h'-scheme
tron
parents: 3142
diff changeset
    13
#include "road_map.h"
1363
775a7ee52369 (svn r1867) Include tables/sprites.h only in files which need it
tron
parents: 1330
diff changeset
    14
#include "table/sprites.h"
507
04b5403aaf6b (svn r815) Include strings.h only in the files which need it.
tron
parents: 497
diff changeset
    15
#include "table/strings.h"
679
04ca2cd69420 (svn r1117) Move map arrays and some related macros into their own files map.c and map.h
tron
parents: 555
diff changeset
    16
#include "map.h"
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6259
diff changeset
    17
#include "landscape.h"
1209
2e00193652b2 (svn r1713) Split off several functions which query/set information about a single tile from map.h and put them into a seperate file tile.h
tron
parents: 1123
diff changeset
    18
#include "tile.h"
3319
16c0f06829a5 (svn r4085) Add GetTown{Index,ByTile}() to get the town index resp. the town from a tile
tron
parents: 3286
diff changeset
    19
#include "town_map.h"
3154
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
    20
#include "tunnel_map.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    21
#include "vehicle.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    22
#include "viewport.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    23
#include "command.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    24
#include "pathfind.h"
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
    25
#include "engine.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    26
#include "town.h"
337
cbe0c766c947 (svn r513) Merge revisions 402, 416, 417, 478, 479, 511, 512 from map to trunk
tron
parents: 283
diff changeset
    27
#include "sound.h"
389
16ee9854091e (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 337
diff changeset
    28
#include "station.h"
405
415546028e8d (svn r602) -newgrf: Move DrawTileSeqStruct & co and struct SpriteGroup to sprite.h (pasky)
darkvater
parents: 403
diff changeset
    29
#include "sprite.h"
1313
f1013ec3d318 (svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents: 1247
diff changeset
    30
#include "depot.h"
1542
62a03537ad0b (svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents: 1536
diff changeset
    31
#include "waypoint.h"
4440
292881d13622 (svn r6212) Remove dependency on window.h from station.h
tron
parents: 4434
diff changeset
    32
#include "window.h"
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    33
#include "rail.h"
2236
34daee5dfc60 (svn r2756) Renamed railtypes into _railtypes
ludde
parents: 2233
diff changeset
    34
#include "railtypes.h" // include table for railtypes
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
    35
#include "newgrf.h"
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
    36
#include "yapf/yapf.h"
3757
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
    37
#include "newgrf_callbacks.h"
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
    38
#include "newgrf_station.h"
4556
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
    39
#include "train.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    40
2261
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    41
const byte _track_sloped_sprites[14] = {
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    42
	14, 15, 22, 13,
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    43
	 0, 21, 17, 12,
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    44
	23,  0, 18, 20,
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    45
	19, 16
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    46
};
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
    47
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    48
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    49
/*         4
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    50
 *     ---------
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    51
 *    |\       /|
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    52
 *    | \    1/ |
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    53
 *    |  \   /  |
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    54
 *    |   \ /   |
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    55
 *  16|    \    |32
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
    56
 *    |   / \2  |
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    57
 *    |  /   \  |
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    58
 *    | /     \ |
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    59
 *    |/       \|
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    60
 *     ---------
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    61
 *         8
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    62
 */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    63
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    64
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    65
22
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 13
diff changeset
    66
/* MAP2 byte:    abcd???? => Signal On? Same coding as map3lo
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
    67
 * MAP3LO byte:  abcd???? => Signal Exists?
4434
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
    68
 *               a and b are for diagonals, upper and left,
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
    69
 *               one for each direction. (ie a == NE->SW, b ==
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
    70
 *               SW->NE, or v.v., I don't know. b and c are
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
    71
 *               similar for lower and right.
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    72
 * MAP2 byte:    ????abcd => Type of ground.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    73
 * MAP3LO byte:  ????abcd => Type of rail.
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    74
 * MAP5:         00abcdef => rail
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    75
 *               01abcdef => rail w/ signals
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    76
 *               10uuuuuu => unused
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
    77
 *               11uuuudd => rail depot
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    78
 */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    79
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    80
static bool CheckTrackCombination(TileIndex tile, TrackBits to_build, uint flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
{
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
    82
	TrackBits current; // The current track layout
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
    83
	TrackBits future;  // The track layout we want to build
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    84
	_error_message = STR_1001_IMPOSSIBLE_TRACK_COMBINATION;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
    86
	if (!IsPlainRailTile(tile)) return false;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    87
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    88
	/* So, we have a tile with tracks on it (and possibly signals). Let's see
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    89
	 * what tracks first */
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    90
	current = GetTrackBits(tile);
1946
f197fb0d840f (svn r2452) Fix defect in r2448 which caused building tracks unexpectedly fail or succeed
tron
parents: 1942
diff changeset
    91
	future = current | to_build;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
    92
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    93
	/* Are we really building something new? */
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    94
	if (current == future) {
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    95
		/* Nothing new is being built */
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    96
		_error_message = STR_1007_ALREADY_BUILT;
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    97
		return false;
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
    98
	}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
    99
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   100
	/* Let's see if we may build this */
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
   101
	if (flags & DC_NO_RAIL_OVERLAP || HasSignals(tile)) {
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   102
		/* If we are not allowed to overlap (flag is on for ai players or we have
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   103
		 * signals on the tile), check that */
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   104
		return future == TRACK_BIT_HORZ || future == TRACK_BIT_VERT;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   105
	} else {
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   106
		/* Normally, we may overlap and any combination is valid */
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   107
		return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   108
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   109
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   110
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   111
4067
5ef297943eff (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 4052
diff changeset
   112
static const TrackBits _valid_tileh_slopes[][15] = {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   113
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   114
/* set of normal ones */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   115
{
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   116
	TRACK_BIT_ALL,
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   117
	TRACK_BIT_RIGHT,
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   118
	TRACK_BIT_UPPER,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   119
	TRACK_BIT_X,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   120
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   121
	TRACK_BIT_LEFT,
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   122
	TRACK_BIT_NONE,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   123
	TRACK_BIT_Y,
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   124
	TRACK_BIT_LOWER,
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   125
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   126
	TRACK_BIT_LOWER,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   127
	TRACK_BIT_Y,
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   128
	TRACK_BIT_NONE,
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   129
	TRACK_BIT_LEFT,
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   130
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   131
	TRACK_BIT_X,
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   132
	TRACK_BIT_UPPER,
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   133
	TRACK_BIT_RIGHT,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
},
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   135
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   136
/* allowed rail for an evenly raised platform */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
{
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   138
	TRACK_BIT_NONE,
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   139
	TRACK_BIT_LEFT,
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   140
	TRACK_BIT_LOWER,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   141
	TRACK_BIT_Y | TRACK_BIT_LOWER | TRACK_BIT_LEFT,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   142
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   143
	TRACK_BIT_RIGHT,
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   144
	TRACK_BIT_ALL,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   145
	TRACK_BIT_X | TRACK_BIT_LOWER | TRACK_BIT_RIGHT,
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   146
	TRACK_BIT_ALL,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   147
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   148
	TRACK_BIT_UPPER,
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   149
	TRACK_BIT_X | TRACK_BIT_UPPER | TRACK_BIT_LEFT,
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   150
	TRACK_BIT_ALL,
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   151
	TRACK_BIT_ALL,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   152
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   153
	TRACK_BIT_Y | TRACK_BIT_UPPER | TRACK_BIT_RIGHT,
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   154
	TRACK_BIT_ALL,
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   155
	TRACK_BIT_ALL
3276
97da497e3a29 (svn r3988) Remove the info about valid rails on shore tiles. It's the same as for any other sloped tile
tron
parents: 3274
diff changeset
   156
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   157
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   158
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   159
uint GetRailFoundation(Slope tileh, TrackBits bits)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   160
{
3878
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   161
	uint i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   162
4246
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   163
	if (!IsSteepSlope(tileh)) {
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   164
		if ((~_valid_tileh_slopes[0][tileh] & bits) == 0) return 0;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   165
		if ((~_valid_tileh_slopes[1][tileh] & bits) == 0) return tileh;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   166
	}
3878
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   167
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   168
	switch (bits) {
4253
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   169
		default: NOT_REACHED();
3878
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   170
		case TRACK_BIT_X: i = 0; break;
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   171
		case TRACK_BIT_Y: i = 1; break;
4253
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   172
		case TRACK_BIT_LEFT:  return 15 + 8 + (tileh == SLOPE_STEEP_W ? 4 : 0);
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   173
		case TRACK_BIT_LOWER: return 15 + 8 + (tileh == SLOPE_STEEP_S ? 5 : 1);
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   174
		case TRACK_BIT_RIGHT: return 15 + 8 + (tileh == SLOPE_STEEP_E ? 6 : 2);
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   175
		case TRACK_BIT_UPPER: return 15 + 8 + (tileh == SLOPE_STEEP_N ? 7 : 3);
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   176
	}
3878
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   177
	switch (tileh) {
4246
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   178
		case SLOPE_W:
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   179
		case SLOPE_STEEP_W: i += 0; break;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   180
		case SLOPE_S:
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   181
		case SLOPE_STEEP_S: i += 2; break;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   182
		case SLOPE_E:
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   183
		case SLOPE_STEEP_E: i += 4; break;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   184
		case SLOPE_N:
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   185
		case SLOPE_STEEP_N: i += 6; break;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   186
		default: return 0;
3878
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   187
	}
ef06782573c0 (svn r4927) Replace 3 big ifs (which regard foundations) by a bit less confusing code
tron
parents: 3869
diff changeset
   188
	return i + 15;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   189
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   190
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
   191
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   192
static CommandCost CheckRailSlope(Slope tileh, TrackBits rail_bits, TrackBits existing, TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   193
{
4246
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   194
	if (IsSteepSlope(tileh)) {
6452
beefb2a80325 (svn r9602) -Fix (r5833): Building rail on steep slopes ignored build_on_slopes patch setting.
peter1138
parents: 6432
diff changeset
   195
		if (_patches.build_on_slopes && existing == 0) {
4253
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   196
			TrackBits valid = TRACK_BIT_CROSS | (HASBIT(1 << SLOPE_STEEP_W | 1 << SLOPE_STEEP_E, tileh) ? TRACK_BIT_VERT : TRACK_BIT_HORZ);
b468db807b66 (svn r5864) -Feature: Also allow horizontal and vertical rails on steep slopes
tron
parents: 4246
diff changeset
   197
			if (valid & rail_bits) return _price.terraform;
4246
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   198
		}
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
   199
	} else {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   200
		rail_bits |= existing;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   201
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   202
		/* don't allow building on the lower side of a coast */
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   203
		if (IsTileType(tile, MP_WATER) &&
3276
97da497e3a29 (svn r3988) Remove the info about valid rails on shore tiles. It's the same as for any other sloped tile
tron
parents: 3274
diff changeset
   204
				~_valid_tileh_slopes[1][tileh] & rail_bits) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   205
			return_cmd_error(STR_3807_CAN_T_BUILD_ON_WATER);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   206
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   207
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   208
		/* no special foundation */
6791
26232b05aa88 (svn r10030) -Fix [FS#823]: one could build on (some) slopes when building on slopes was disabled.
rubidium
parents: 6770
diff changeset
   209
		if ((~_valid_tileh_slopes[0][tileh] & rail_bits) == 0) {
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   210
			return CommandCost();
6791
26232b05aa88 (svn r10030) -Fix [FS#823]: one could build on (some) slopes when building on slopes was disabled.
rubidium
parents: 6770
diff changeset
   211
		} else if (!_patches.build_on_slopes || _is_old_ai_player) {
26232b05aa88 (svn r10030) -Fix [FS#823]: one could build on (some) slopes when building on slopes was disabled.
rubidium
parents: 6770
diff changeset
   212
			return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
26232b05aa88 (svn r10030) -Fix [FS#823]: one could build on (some) slopes when building on slopes was disabled.
rubidium
parents: 6770
diff changeset
   213
		}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   214
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   215
		if ((~_valid_tileh_slopes[1][tileh] & rail_bits) == 0 || ( // whole tile is leveled up
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
   216
					(rail_bits == TRACK_BIT_X || rail_bits == TRACK_BIT_Y) &&
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   217
					(tileh == SLOPE_W || tileh == SLOPE_S || tileh == SLOPE_E || tileh == SLOPE_N)
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   218
				)) { // partly up
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   219
			return CommandCost((existing != 0) ? 0 : _price.terraform);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   220
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   221
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   222
	return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   223
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   224
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   225
/* Validate functions for rail building */
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   226
static inline bool ValParamTrackOrientation(Track track) {return IsValidTrack(track);}
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   227
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   228
/** Build a single piece of rail
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   229
 * @param tile tile  to build on
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   230
 * @param flags operation to perform
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   231
 * @param p1 railtype of being built piece (normal, mono, maglev)
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   232
 * @param p2 rail track to build
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   233
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   234
CommandCost CmdBuildSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   235
{
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   236
	Slope tileh;
5058
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   237
	RailType railtype;
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   238
	Track track;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   239
	TrackBits trackbit;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   240
	CommandCost cost;
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   241
	CommandCost ret;
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   242
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   243
	if (!ValParamRailtype(p1) || !ValParamTrackOrientation((Track)p2)) return CMD_ERROR;
5058
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   244
	railtype = (RailType)p1;
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   245
	track = (Track)p2;
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   246
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   247
	tileh = GetTileSlope(tile, NULL);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   248
	trackbit = TrackToTrackBits(track);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   249
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   250
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   251
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   252
	switch (GetTileType(tile)) {
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   253
		case MP_RAILWAY:
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   254
			if (!CheckTrackCombination(tile, trackbit, flags) ||
6406
8ccf18e94c67 (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: 6393
diff changeset
   255
					!EnsureNoVehicleOnGround(tile)) {
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   256
				return CMD_ERROR;
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   257
			}
4180
159e7febf0ce (svn r5618) Remove a redundant check, CheckTrackCombination() a few lines above performs the same test
tron
parents: 4158
diff changeset
   258
			if (!IsTileOwner(tile, _current_player) ||
5394
bce82a9368c7 (svn r7583) -Fix (r7573): Merging of bridge branch broke (partially reverted?) automatic railtype conversion when building track on existing rail.
peter1138
parents: 5385
diff changeset
   259
					!IsCompatibleRail(GetRailType(tile), railtype)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   260
				/* Get detailed error message */
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   261
				return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   262
			}
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   263
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   264
			ret = CheckRailSlope(tileh, trackbit, GetTrackBits(tile), tile);
1691
852ca27d6eef (svn r2195) Add CmdFailed() as the One True Way(tm) to check if a command failed.
tron
parents: 1669
diff changeset
   265
			if (CmdFailed(ret)) return ret;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   266
			cost.AddCost(ret);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   267
5059
fec3defb6e67 (svn r7112) -Codechange (r7106): Improve the test for determining if the rail type should be converted
peter1138
parents: 5058
diff changeset
   268
			/* If the rail types don't match, try to convert only if engines of
fec3defb6e67 (svn r7112) -Codechange (r7106): Improve the test for determining if the rail type should be converted
peter1138
parents: 5058
diff changeset
   269
			 * the present rail type are powered on the new rail type. */
fec3defb6e67 (svn r7112) -Codechange (r7106): Improve the test for determining if the rail type should be converted
peter1138
parents: 5058
diff changeset
   270
			if (GetRailType(tile) != railtype && HasPowerOnRail(GetRailType(tile), railtype)) {
5058
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   271
				ret = DoCommand(tile, tile, railtype, flags, CMD_CONVERT_RAIL);
5054
45cfda0fd7eb (svn r7106) -Feature: Allow over-building of compatible railtypes, i.e. normal and
peter1138
parents: 5015
diff changeset
   272
				if (CmdFailed(ret)) return ret;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   273
				cost.AddCost(ret);
5054
45cfda0fd7eb (svn r7106) -Feature: Allow over-building of compatible railtypes, i.e. normal and
peter1138
parents: 5015
diff changeset
   274
			}
45cfda0fd7eb (svn r7106) -Feature: Allow over-building of compatible railtypes, i.e. normal and
peter1138
parents: 5015
diff changeset
   275
1719
ddb7e8c7d1a4 (svn r2223) When adding tracks to a railway tile reset the ground to bare land, fix for a glitch in r2131
tron
parents: 1691
diff changeset
   276
			if (flags & DC_EXEC) {
3523
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
   277
				SetRailGroundType(tile, RAIL_GROUND_BARREN);
5411
9ad8285b2f0d (svn r7609) -Codechange: remove some direct map accesses to m5 and some unneeded signal removal code in ClearTileTrack as it is done in CmdRemoveSingleRail too, which is called for every removed trackbit.
rubidium
parents: 5394
diff changeset
   278
				SetTrackBits(tile, GetTrackBits(tile) | trackbit);
1719
ddb7e8c7d1a4 (svn r2223) When adding tracks to a railway tile reset the ground to bare land, fix for a glitch in r2131
tron
parents: 1691
diff changeset
   279
			}
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   280
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   281
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   282
		case MP_STREET:
3142
ef213f02d4bf (svn r3760) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers. Quite similar to r3699, though this time for placing the rails
tron
parents: 3103
diff changeset
   283
#define M(x) (1 << (x))
ef213f02d4bf (svn r3760) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers. Quite similar to r3699, though this time for placing the rails
tron
parents: 3103
diff changeset
   284
			/* Level crossings may only be built on these slopes */
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   285
			if (!HASBIT(M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT), tileh)) {
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   286
				return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
3142
ef213f02d4bf (svn r3760) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers. Quite similar to r3699, though this time for placing the rails
tron
parents: 3103
diff changeset
   287
			}
ef213f02d4bf (svn r3760) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers. Quite similar to r3699, though this time for placing the rails
tron
parents: 3103
diff changeset
   288
#undef M
ef213f02d4bf (svn r3760) Replace some magic numbers for checking for a suitable slope for a level crossing by some less magic numbers. Quite similar to r3699, though this time for placing the rails
tron
parents: 3103
diff changeset
   289
6406
8ccf18e94c67 (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: 6393
diff changeset
   290
			if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   291
4140
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   292
			if (GetRoadTileType(tile) == ROAD_TILE_NORMAL) {
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   293
				if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   294
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   295
				RoadTypes roadtypes = GetRoadTypes(tile);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   296
				RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   297
				RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   298
				switch (roadtypes) {
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   299
					default: break;
6728
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   300
					case ROADTYPES_TRAM:
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   301
						/* Tram crossings must always have road. */
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   302
						SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   303
						roadtypes |= ROADTYPES_ROAD;
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   304
						break;
61568a945b40 (svn r9960) -Fix [FS#813]: road wasn't properly added when overbuilding a tram rails with normal rails to for a crossing.
rubidium
parents: 6683
diff changeset
   305
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   306
					case ROADTYPES_ROADTRAM: if (road == tram) break;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   307
						/* FALL THROUGH */
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   308
					case ROADTYPES_ROADHWAY: // Road and highway are incompatible in this case
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   309
					case ROADTYPES_TRAMHWAY: // Tram and highway are incompatible in this case
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   310
					case ROADTYPES_ALL:      // Also incompatible
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   311
						return CMD_ERROR;
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   312
				}
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   313
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   314
				road |= tram | GetRoadBits(tile, ROADTYPE_HWAY);
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   315
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   316
				if ((track == TRACK_X && road == ROAD_Y) ||
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   317
						(track == TRACK_Y && road == ROAD_X)) {
4140
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   318
					if (flags & DC_EXEC) {
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   319
						MakeRoadCrossing(tile, GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY), _current_player, (track == TRACK_X ? AXIS_Y : AXIS_X), railtype, roadtypes, GetTownIndex(tile));
4140
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   320
					}
1765a8dd17dc (svn r5500) Undo r4597, because it breaks the intended change of r5315 to prohibit building rails on a road tile while road works are in progress
tron
parents: 4139
diff changeset
   321
					break;
4139
611ec4ec9a3b (svn r5497) -Fix: somehow in r5315 slipped some wrong logic, allowed you to build rail on all road pieces without really building it ;)
truelight
parents: 4081
diff changeset
   322
				}
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   323
			}
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   324
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
   325
			if (IsLevelCrossing(tile) && GetCrossingRailBits(tile) == trackbit) {
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   326
				return_cmd_error(STR_1007_ALREADY_BUILT);
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
   327
			}
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   328
			/* FALLTHROUGH */
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   329
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   330
		default:
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   331
			ret = CheckRailSlope(tileh, trackbit, TRACK_BIT_NONE, tile);
1691
852ca27d6eef (svn r2195) Add CmdFailed() as the One True Way(tm) to check if a command failed.
tron
parents: 1669
diff changeset
   332
			if (CmdFailed(ret)) return ret;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   333
			cost.AddCost(ret);
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   334
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   335
			ret = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
1691
852ca27d6eef (svn r2195) Add CmdFailed() as the One True Way(tm) to check if a command failed.
tron
parents: 1669
diff changeset
   336
			if (CmdFailed(ret)) return ret;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   337
			cost.AddCost(ret);
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   338
5058
8175de8766c0 (svn r7111) After checking p1 in CmdBuildSingleRail() assign it to a variable railtype instead of using p1 in the function. Also assign p2 to track only after it has been checked for validity
tron
parents: 5055
diff changeset
   339
			if (flags & DC_EXEC) MakeRailNormal(tile, _current_player, trackbit, railtype);
1627
f365c96e74a4 (svn r2131) -Fix: Rewrite CmdBuildSingleRail(), this addresses several issues:
tron
parents: 1609
diff changeset
   340
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   341
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   342
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   343
	if (flags & DC_EXEC) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   344
		MarkTileDirtyByTile(tile);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   345
		SetSignalsOnBothDir(tile, track);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   346
		YapfNotifyTrackLayoutChange(tile, track);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   347
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   348
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   349
	return cost.AddCost(_price.build_rail);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   350
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   351
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   352
/** Remove a single piece of track
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   353
 * @param tile tile to remove track from
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   354
 * @param flags operation to perform
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   355
 * @param p1 unused
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   356
 * @param p2 rail orientation
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   357
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   358
CommandCost CmdRemoveSingleRail(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   359
{
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   360
	Track track = (Track)p2;
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   361
	TrackBits trackbit;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   362
	CommandCost cost(_price.remove_rail);
3284
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   363
	bool crossing = false;
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   364
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   365
	if (!ValParamTrackOrientation((Track)p2)) return CMD_ERROR;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   366
	trackbit = TrackToTrackBits(track);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   367
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   368
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   369
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   370
	switch (GetTileType(tile)) {
3071
6f3417a859d4 (svn r3660) Convert further road bits and type references to the functions/enums
tron
parents: 3069
diff changeset
   371
		case MP_STREET: {
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   372
			if (!IsLevelCrossing(tile) ||
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   373
					GetCrossingRailBits(tile) != trackbit ||
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   374
					(_current_player != OWNER_WATER && !CheckTileOwnership(tile)) ||
6406
8ccf18e94c67 (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: 6393
diff changeset
   375
					!EnsureNoVehicleOnGround(tile)) {
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   376
				return CMD_ERROR;
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   377
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   378
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   379
			if (flags & DC_EXEC) {
6661
1716fce5ad29 (svn r9892) -Codechange: lots of ground work for allowing multiple types of "road" with multiple owners on a single tile.
rubidium
parents: 6591
diff changeset
   380
				MakeRoadNormal(tile, GetCrossingRoadBits(tile), GetRoadTypes(tile), GetTownIndex(tile), GetRoadOwner(tile, ROADTYPE_ROAD), GetRoadOwner(tile, ROADTYPE_TRAM), GetRoadOwner(tile, ROADTYPE_HWAY));
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   381
			}
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   382
			break;
3071
6f3417a859d4 (svn r3660) Convert further road bits and type references to the functions/enums
tron
parents: 3069
diff changeset
   383
		}
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   384
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   385
		case MP_RAILWAY: {
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   386
			TrackBits present;
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   387
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   388
			if (!IsPlainRailTile(tile) ||
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   389
					(_current_player != OWNER_WATER && !CheckTileOwnership(tile)) ||
6406
8ccf18e94c67 (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: 6393
diff changeset
   390
					!EnsureNoVehicleOnGround(tile)) {
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   391
				return CMD_ERROR;
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   392
			}
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   393
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   394
			present = GetTrackBits(tile);
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   395
			if ((present & trackbit) == 0) return CMD_ERROR;
3284
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   396
			if (present == (TRACK_BIT_X | TRACK_BIT_Y)) crossing = true;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   397
1963
877cc0deb5b1 (svn r2469) - Add: When removing tracks with the 'remove' tool, have it automatically remove signals on the tracks.
hackykid
parents: 1954
diff changeset
   398
			/* Charge extra to remove signals on the track, if they are there */
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   399
			if (HasSignalOnTrack(tile, track))
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   400
				cost.AddCost(DoCommand(tile, track, 0, flags, CMD_REMOVE_SIGNALS));
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   401
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   402
			if (flags & DC_EXEC) {
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   403
				present ^= trackbit;
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   404
				if (present == 0) {
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   405
					DoClearSquare(tile);
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   406
				} else {
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   407
					SetTrackBits(tile, present);
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   408
				}
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   409
			}
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   410
			break;
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   411
		}
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   412
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   413
		default: return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   414
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   415
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   416
	if (flags & DC_EXEC) {
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   417
		MarkTileDirtyByTile(tile);
3284
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   418
		if (crossing) {
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   419
			/* crossing is set when only TRACK_BIT_X and TRACK_BIT_Y are set. As we
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   420
			 * are removing one of these pieces, we'll need to update signals for
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   421
			 * both directions explicitly, as after the track is removed it won't
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   422
			 * 'connect' with the other piece. */
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   423
			SetSignalsOnBothDir(tile, TRACK_X);
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   424
			SetSignalsOnBothDir(tile, TRACK_Y);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   425
			YapfNotifyTrackLayoutChange(tile, TRACK_X);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   426
			YapfNotifyTrackLayoutChange(tile, TRACK_Y);
3284
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   427
		} else {
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   428
			SetSignalsOnBothDir(tile, track);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   429
			YapfNotifyTrackLayoutChange(tile, track);
3284
84eda61a0167 (svn r3998) - Fix: When removing rail track from a while where only X and Y (/ and \) pieces exist, explicitly update signals in both directions.
peter1138
parents: 3279
diff changeset
   430
		}
3273
3089ecca8e21 (svn r3985) Make CmdBuildSingleRail() a bit more comprehensible
tron
parents: 3271
diff changeset
   431
	}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   432
1963
877cc0deb5b1 (svn r2469) - Add: When removing tracks with the 'remove' tool, have it automatically remove signals on the tracks.
hackykid
parents: 1954
diff changeset
   433
	return cost;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   434
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   435
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   436
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   437
static const TileIndexDiffC _trackdelta[] = {
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   438
	{ -1,  0 }, {  0,  1 }, { -1,  0 }, {  0,  1 }, {  1,  0 }, {  0,  1 },
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   439
	{  0,  0 },
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   440
	{  0,  0 },
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   441
	{  1,  0 }, {  0, -1 }, {  0, -1 }, {  1,  0 }, {  0, -1 }, { -1,  0 },
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   442
	{  0,  0 },
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   443
	{  0,  0 }
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   444
};
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   445
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   446
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   447
static CommandCost ValidateAutoDrag(Trackdir *trackdir, TileIndex start, TileIndex end)
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   448
{
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   449
	int x = TileX(start);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   450
	int y = TileY(start);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   451
	int ex = TileX(end);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   452
	int ey = TileY(end);
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   453
	int dx, dy, trdx, trdy;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   454
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   455
	if (!ValParamTrackOrientation(TrackdirToTrack(*trackdir))) return CMD_ERROR;
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   456
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   457
	/* calculate delta x,y from start to end tile */
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   458
	dx = ex - x;
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   459
	dy = ey - y;
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   460
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   461
	/* calculate delta x,y for the first direction */
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   462
	trdx = _trackdelta[*trackdir].x;
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   463
	trdy = _trackdelta[*trackdir].y;
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   464
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   465
	if (!IsDiagonalTrackdir(*trackdir)) {
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   466
		trdx += _trackdelta[*trackdir ^ 1].x;
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   467
		trdy += _trackdelta[*trackdir ^ 1].y;
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   468
	}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   469
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   470
	/* validate the direction */
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   471
	while (
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   472
		(trdx <= 0 && dx > 0) ||
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   473
		(trdx >= 0 && dx < 0) ||
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   474
		(trdy <= 0 && dy > 0) ||
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   475
		(trdy >= 0 && dy < 0)
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   476
	) {
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   477
		if (!HASBIT(*trackdir, 3)) { // first direction is invalid, try the other
6127
21850c2e296c (svn r8864) -Codechange: make ClrBitT(), SetBitT() and ToggleBitT more like CLRBIT() and so on (modify value of the first parameter instead or returning the result)
KUDr
parents: 6106
diff changeset
   478
			SetBitT(*trackdir, 3); // reverse the direction
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   479
			trdx = -trdx;
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   480
			trdy = -trdy;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   481
		} else { // other direction is invalid too, invalid drag
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   482
			return CMD_ERROR;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   483
		}
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   484
	}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   485
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   486
	/* (for diagonal tracks, this is already made sure of by above test), but:
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   487
	 * for non-diagonal tracks, check if the start and end tile are on 1 line */
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   488
	if (!IsDiagonalTrackdir(*trackdir)) {
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   489
		trdx = _trackdelta[*trackdir].x;
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   490
		trdy = _trackdelta[*trackdir].y;
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   491
		if (abs(dx) != abs(dy) && abs(dx) + abs(trdy) != abs(dy) + abs(trdx))
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   492
			return CMD_ERROR;
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   493
	}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   494
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   495
	return CommandCost();
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   496
}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   497
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   498
/** Build a stretch of railroad tracks.
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   499
 * @param tile start tile of drag
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   500
 * @param flags operation to perform
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   501
 * @param p1 end tile of drag
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   502
 * @param p2 various bitstuffed elements
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   503
 * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   504
 * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   505
 * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   506
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   507
static CommandCost CmdRailTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   508
{
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   509
	CommandCost ret, total_cost;
2140
a04d0142ad65 (svn r2650) Convert many explicit shifts+ands to extract bits to invocations of GB - should be a bit nicer to read
tron
parents: 2111
diff changeset
   510
	Track track = (Track)GB(p2, 4, 3);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   511
	Trackdir trackdir;
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   512
	byte mode = HASBIT(p2, 7);
2604
e3e60351c067 (svn r3141) Replace incorrect railtype bitmask in CmdRailTrackHelper with appropriate GB()
peter1138
parents: 2549
diff changeset
   513
	RailType railtype = (RailType)GB(p2, 0, 4);
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   514
	TileIndex end_tile;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   515
2604
e3e60351c067 (svn r3141) Replace incorrect railtype bitmask in CmdRailTrackHelper with appropriate GB()
peter1138
parents: 2549
diff changeset
   516
	if (!ValParamRailtype(railtype) || !ValParamTrackOrientation(track)) return CMD_ERROR;
2934
3f29a7212713 (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
   517
	if (p1 >= MapSize()) return CMD_ERROR;
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   518
	end_tile = p1;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   519
	trackdir = TrackToTrackdir(track);
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   520
889
64d2f7d5f02b (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: 826
diff changeset
   521
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
64d2f7d5f02b (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: 826
diff changeset
   522
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   523
	if (CmdFailed(ValidateAutoDrag(&trackdir, tile, end_tile))) return CMD_ERROR;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   524
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   525
	if (flags & DC_EXEC) SndPlayTileFx(SND_20_SPLAT_2, tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   526
2952
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2951
diff changeset
   527
	for (;;) {
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   528
		ret = DoCommand(tile, railtype, TrackdirToTrack(trackdir), flags, (mode == 0) ? CMD_BUILD_SINGLE_RAIL : CMD_REMOVE_SINGLE_RAIL);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   529
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   530
		if (CmdFailed(ret)) {
3671
5b6a80e29dd6 (svn r4586) - Codechange: Recursive commands that rely on _error_message to handle success/failure can fail if a recursive call fails but doesn't set the error message, thus resulting in an old, possibly erroneous being used (see FS#130 prior to r4585). Now properly reset the global variable _error_message in these cases.
Darkvater
parents: 3657
diff changeset
   531
			if ((_error_message != STR_1007_ALREADY_BUILT) && (mode == 0)) break;
5b6a80e29dd6 (svn r4586) - Codechange: Recursive commands that rely on _error_message to handle success/failure can fail if a recursive call fails but doesn't set the error message, thus resulting in an old, possibly erroneous being used (see FS#130 prior to r4585). Now properly reset the global variable _error_message in these cases.
Darkvater
parents: 3657
diff changeset
   532
			_error_message = INVALID_STRING_ID;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   533
		} else {
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   534
			total_cost.AddCost(ret);
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   535
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   536
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   537
		if (tile == end_tile) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   538
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   539
		tile += ToTileIndexDiff(_trackdelta[trackdir]);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   540
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   541
		/* toggle railbit for the non-diagonal tracks */
6127
21850c2e296c (svn r8864) -Codechange: make ClrBitT(), SetBitT() and ToggleBitT more like CLRBIT() and so on (modify value of the first parameter instead or returning the result)
KUDr
parents: 6106
diff changeset
   542
		if (!IsDiagonalTrackdir(trackdir)) ToggleBitT(trackdir, 0);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   543
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   544
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   545
	return (total_cost.GetCost() == 0) ? CMD_ERROR : total_cost;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   546
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   547
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   548
/** Build rail on a stretch of track.
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   549
 * Stub for the unified rail builder/remover
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   550
 * @param tile start tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   551
 * @param flags operation to perform
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   552
 * @param p1 end tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   553
 * @param p2 various bitstuffed elements
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   554
 * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   555
 * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   556
 * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   557
 * @see CmdRailTrackHelper
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   558
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   559
CommandCost CmdBuildRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   560
{
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   561
	return CmdRailTrackHelper(tile, flags, p1, CLRBIT(p2, 7));
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   562
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   563
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   564
/** Build rail on a stretch of track.
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   565
 * Stub for the unified rail builder/remover
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   566
 * @param tile start tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   567
 * @param flags operation to perform
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   568
 * @param p1 end tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   569
 * @param p2 various bitstuffed elements
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   570
 * - p2 = (bit 0-3) - railroad type normal/maglev (0 = normal, 1 = mono, 2 = maglev)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   571
 * - p2 = (bit 4-6) - track-orientation, valid values: 0-5 (Track enum)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   572
 * - p2 = (bit 7)   - 0 = build, 1 = remove tracks
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   573
 * @see CmdRailTrackHelper
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   574
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   575
CommandCost CmdRemoveRailroadTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   576
{
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   577
	return CmdRailTrackHelper(tile, flags, p1, SETBIT(p2, 7));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   578
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   579
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   580
/** Build a train depot
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   581
 * @param tile position of the train depot
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   582
 * @param flags operation to perform
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   583
 * @param p1 rail type
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
   584
 * @param p2 bit 0..1 entrance direction (DiagDirection)
2085
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   585
 *
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   586
 * @todo When checking for the tile slope,
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   587
 * 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
   588
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   589
CommandCost CmdBuildTrainDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   590
{
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   591
	Depot *d;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   592
	CommandCost cost;
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   593
	Slope tileh;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   594
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   595
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   596
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   597
	/* check railtype and valid direction for depot (0 through 3), 4 in total */
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
   598
	if (!ValParamRailtype(p1)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   599
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   600
	tileh = GetTileSlope(tile, NULL);
2085
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   601
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
   602
	DiagDirection dir = Extract<DiagDirection, 0>(p2);
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
   603
2085
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   604
	/* Prohibit construction if
4549
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   605
	 * The tile is non-flat AND
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   606
	 * 1) The AI is "old-school"
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   607
	 * 2) build-on-slopes is disabled
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   608
	 * 3) the tile is steep i.e. spans two height levels
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   609
	 * 4) the exit points in the wrong direction
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   610
	 */
2085
876f20a0e843 (svn r2595) -Codechange: Introduced "IsSteepTileh" to find whether a tile is steep
celestar
parents: 2049
diff changeset
   611
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   612
	if (tileh != SLOPE_FLAT && (
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   613
				_is_old_ai_player ||
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   614
				!_patches.build_on_slopes ||
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
   615
				IsSteepSlope(tileh) ||
6134
871305fd9ab7 (svn r8876) -Fix
tron
parents: 6133
diff changeset
   616
				!CanBuildDepotByTileh(dir, tileh)
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   617
			)) {
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
   618
		return_cmd_error(STR_0007_FLAT_LAND_REQUIRED);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   619
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   620
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   621
	cost = DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   622
	if (CmdFailed(cost)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   623
5385
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
   624
	if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
   625
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   626
	d = AllocateDepot();
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
   627
	if (d == NULL) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   628
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   629
	if (flags & DC_EXEC) {
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   630
		MakeRailDepot(tile, _current_player, dir, (RailType)p1);
3101
a44fdf9faef1 (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: 3099
diff changeset
   631
		MarkTileDirtyByTile(tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   632
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   633
		d->xy = tile;
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   634
		d->town_index = ClosestTownFromTile(tile, (uint)-1)->index;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   635
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   636
		UpdateSignalsOnSegment(tile, dir);
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   637
		YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir)));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   638
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   639
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   640
	return cost.AddCost(_price.build_train_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   641
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   642
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   643
/** Build signals, alternate between double/single, signal/semaphore,
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   644
 * pre/exit/combo-signals, and what-else not. If the rail piece does not
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   645
 * have any signals, bit 4 (cycle signal-type) is ignored
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   646
 * @param tile tile where to build the signals
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   647
 * @param flags operation to perform
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   648
 * @param p1 various bitstuffed elements
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   649
 * - p1 = (bit 0-2) - track-orientation, valid values: 0-5 (Track enum)
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   650
 * - p1 = (bit 3)   - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   651
 * - p1 = (bit 4)   - 0 = signals, 1 = semaphores
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   652
 * @param p2 used for CmdBuildManySignals() to copy direction of first signal
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   653
 * TODO: p2 should be replaced by two bits for "along" and "against" the track.
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   654
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   655
CommandCost CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   656
{
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   657
	Track track = (Track)GB(p1, 0, 3);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   658
	bool pre_signal = HASBIT(p1, 3);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   659
	SignalVariant sigvar = (pre_signal ^ HASBIT(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   660
	CommandCost cost;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   661
6406
8ccf18e94c67 (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: 6393
diff changeset
   662
	if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicleOnGround(tile))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   663
		return CMD_ERROR;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   664
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   665
	/* Protect against invalid signal copying */
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   666
	if (p2 != 0 && (p2 & SignalOnTrack(track)) == 0) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   667
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   668
	/* You can only build signals on plain rail tiles, and the selected track must exist */
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   669
	if (!IsPlainRailTile(tile) || !HasTrack(tile, track)) return CMD_ERROR;
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   670
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   671
	if (!CheckTileOwnership(tile)) return CMD_ERROR;
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   672
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   673
	_error_message = STR_1005_NO_SUITABLE_RAILROAD_TRACK;
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   674
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   675
	{
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   676
		/* See if this is a valid track combination for signals, (ie, no overlap) */
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   677
		TrackBits trackbits = GetTrackBits(tile);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   678
		if (KILL_FIRST_BIT(trackbits) != 0 && /* More than one track present */
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
   679
				trackbits != TRACK_BIT_HORZ &&
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   680
				trackbits != TRACK_BIT_VERT) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   681
			return CMD_ERROR;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   682
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   683
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   684
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   685
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   686
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   687
	if (!HasSignalOnTrack(tile, track)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   688
		/* build new signals */
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   689
		cost = CommandCost(_price.build_signals);
1066
eaef1465d3ab (svn r1567) -Fix: [110452] On horizontal/vertical tracks you are also charged for building/removing signals on the parallel track on the same tile. Signal updating is also correct. (Hackykid)
darkvater
parents: 1059
diff changeset
   690
	} else {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   691
		if (p2 != 0 && sigvar != GetSignalVariant(tile, track)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   692
			/* convert signals <-> semaphores */
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   693
			cost = CommandCost(_price.build_signals + _price.remove_signals);
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   694
		} else {
6432
226650eb2ef3 (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6427
diff changeset
   695
			/* it is free to change orientation/pre-exit-combo signals */
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   696
			cost = CommandCost();
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   697
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   698
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   699
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   700
	if (flags & DC_EXEC) {
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
   701
		if (!HasSignals(tile)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   702
			/* there are no signals at all on this tile yet */
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
   703
			SetHasSignals(tile, true);
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   704
			SetSignalStates(tile, 0xF); // all signals are on
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   705
			SetPresentSignals(tile, 0); // no signals built by default
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   706
			SetSignalType(tile, track, SIGTYPE_NORMAL);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   707
			SetSignalVariant(tile, track, sigvar);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   708
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   709
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   710
		if (p2 == 0) {
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   711
			if (!HasSignalOnTrack(tile, track)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   712
				/* build new signals */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   713
				SetPresentSignals(tile, GetPresentSignals(tile) | SignalOnTrack(track));
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   714
				SetSignalType(tile, track, SIGTYPE_NORMAL);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   715
				SetSignalVariant(tile, track, sigvar);
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   716
			} else {
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   717
				if (pre_signal) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   718
					/* cycle between normal -> pre -> exit -> combo -> ... */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   719
					SignalType type = GetSignalType(tile, track);
3238
9ebec0a611ee (svn r3912) Move the signal type enum and GetSignalType() to rail_map.h; also add SetSignalType() and use the functions
tron
parents: 3237
diff changeset
   720
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   721
					SetSignalType(tile, track, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : (SignalType)(type + 1));
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   722
				} else {
3522
888ac5081c6e (svn r4378) -Add and make use of an accessor function two-way => one-way => one-way => two-way signal cycling
celestar
parents: 3521
diff changeset
   723
					CycleSignalSide(tile, track);
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   724
				}
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   725
			}
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   726
		} else {
1084
95b7385f8b7b (svn r1585) Rewrite CmdBuildSignals()
tron
parents: 1066
diff changeset
   727
			/* If CmdBuildManySignals is called with copying signals, just copy the
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   728
			 * direction of the first signal given as parameter by CmdBuildManySignals */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   729
			SetPresentSignals(tile, (GetPresentSignals(tile) & ~SignalOnTrack(track)) | (p2 & SignalOnTrack(track)));
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   730
			SetSignalVariant(tile, track, sigvar);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   731
		}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   732
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   733
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   734
		SetSignalsOnBothDir(tile, track);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   735
		YapfNotifyTrackLayoutChange(tile, track);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   736
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   737
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   738
	return cost;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   739
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   740
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   741
static bool CheckSignalAutoFill(TileIndex &tile, Trackdir &trackdir, int &signal_ctr, bool remove)
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   742
{
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   743
	tile = AddTileIndexDiffCWrap(tile, _trackdelta[trackdir]);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   744
	if (tile == INVALID_TILE) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   745
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   746
	/* Check for track bits on the new tile */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   747
	uint32 ts = GetTileTrackStatus(tile, TRANSPORT_RAIL, 0);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   748
	TrackdirBits trackdirbits = (TrackdirBits)(ts & TRACKDIR_BIT_MASK);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   749
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   750
	if (TracksOverlap(TrackdirBitsToTrackBits(trackdirbits))) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   751
	trackdirbits &= TrackdirReachesTrackdirs(trackdir);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   752
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   753
	/* No track bits, must stop */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   754
	if (trackdirbits == TRACKDIR_BIT_NONE) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   755
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   756
	/* Get the first track dir */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   757
	trackdir = RemoveFirstTrackdir(&trackdirbits);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   758
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   759
	/* Any left? It's a junction so we stop */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   760
	if (trackdirbits != TRACKDIR_BIT_NONE) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   761
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   762
	switch (GetTileType(tile)) {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   763
		case MP_RAILWAY:
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   764
			if (IsRailDepot(tile)) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   765
			if (!remove && HasSignalOnTrack(tile, TrackdirToTrack(trackdir))) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   766
			signal_ctr++;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   767
			if (IsDiagonalTrackdir(trackdir)) {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   768
				signal_ctr++;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   769
				/* Ensure signal_ctr even so X and Y pieces get signals */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   770
				CLRBIT(signal_ctr, 0);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   771
			}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   772
			return true;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   773
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   774
		case MP_STREET:
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   775
			if (!IsLevelCrossing(tile)) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   776
			signal_ctr += 2;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   777
			return true;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   778
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   779
		case MP_TUNNELBRIDGE: {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   780
			TileIndex orig_tile = tile;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   781
			/* Skip to end of tunnel or bridge */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   782
			if (IsBridge(tile)) {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   783
				if (GetBridgeTransportType(tile) != TRANSPORT_RAIL) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   784
				if (GetBridgeRampDirection(tile) != TrackdirToExitdir(trackdir)) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   785
				tile = GetOtherBridgeEnd(tile);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   786
			} else {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   787
				if (GetTunnelTransportType(tile) != TRANSPORT_RAIL) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   788
				if (GetTunnelDirection(tile) != TrackdirToExitdir(trackdir)) return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   789
				tile = GetOtherTunnelEnd(tile);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   790
			}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   791
			signal_ctr += 2 + DistanceMax(orig_tile, tile) * 2;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   792
			return true;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   793
		}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   794
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   795
		default: return false;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   796
	}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   797
}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   798
4434
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
   799
/** Build many signals by dragging; AutoSignals
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   800
 * @param tile start tile of drag
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   801
 * @param flags operation to perform
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   802
 * @param p1  end tile of drag
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   803
 * @param p2 various bitstuffed elements
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   804
 * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   805
 * - p2 = (bit  3)    - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   806
 * - p2 = (bit  4)    - 0 = signals, 1 = semaphores
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   807
 * - p2 = (bit  5)    - 0 = build, 1 = remove signals
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   808
 * - p2 = (bit  6)    - 0 = selected stretch, 1 = auto fill
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   809
 * - p2 = (bit 24-31) - user defined signals_density
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   810
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   811
static CommandCost CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   812
{
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   813
	CommandCost ret, total_cost;
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   814
	int signal_ctr;
1954
2beb56cfddbb (svn r2460) - Fix: Prevent assertion failure when trying to drag signals starting from a non-rail tile.
hackykid
parents: 1946
diff changeset
   815
	byte signals;
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   816
	bool error = true;
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   817
	TileIndex end_tile;
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   818
	TileIndex start_tile = tile;
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   819
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   820
	Track track = (Track)GB(p2, 0, 3);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   821
	bool mode = HASBIT(p2, 3);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   822
	bool semaphores = HASBIT(p2, 4);
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   823
	bool remove = HASBIT(p2, 5);
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   824
	bool autofill = HASBIT(p2, 6);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   825
	Trackdir trackdir = TrackToTrackdir(track);
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   826
	byte signal_density = GB(p2, 24, 8);
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   827
2934
3f29a7212713 (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
   828
	if (p1 >= MapSize()) return CMD_ERROR;
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   829
	end_tile = p1;
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   830
	if (signal_density == 0 || signal_density > 20) return CMD_ERROR;
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   831
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
   832
	if (!IsTileType(tile, MP_RAILWAY)) return CMD_ERROR;
1954
2beb56cfddbb (svn r2460) - Fix: Prevent assertion failure when trying to drag signals starting from a non-rail tile.
hackykid
parents: 1946
diff changeset
   833
889
64d2f7d5f02b (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: 826
diff changeset
   834
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
64d2f7d5f02b (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: 826
diff changeset
   835
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   836
	/* for vertical/horizontal tracks, double the given signals density
4549
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   837
	 * since the original amount will be too dense (shorter tracks) */
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   838
	signal_density *= 2;
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   839
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
   840
	if (CmdFailed(ValidateAutoDrag(&trackdir, tile, end_tile))) return CMD_ERROR;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   841
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   842
	track = TrackdirToTrack(trackdir); /* trackdir might have changed, keep track in sync */
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   843
	Trackdir start_trackdir = trackdir;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   844
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   845
	/* Autofill must start on a valid track to be able to avoid loops */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   846
	if (autofill && !HasTrack(tile, track)) return CMD_ERROR;
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   847
6432
226650eb2ef3 (svn r9568) -Documentation: doxygen and comment changes: Root of src is finally done. Now, time to start clearing as much as possible
belugas
parents: 6427
diff changeset
   848
	/* copy the signal-style of the first rail-piece if existing */
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
   849
	if (HasSignals(tile)) {
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   850
		signals = GetPresentSignals(tile) & SignalOnTrack(track);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   851
		if (signals == 0) signals = SignalOnTrack(track); /* Can this actually occur? */
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   852
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   853
		/* copy signal/semaphores style (independent of CTRL) */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   854
		semaphores = GetSignalVariant(tile, track) != SIG_ELECTRIC;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   855
	} else { // no signals exist, drag a two-way signal stretch
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   856
		signals = SignalOnTrack(track);
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   857
	}
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   858
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   859
	byte signal_dir = 0;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   860
	if (signals & SignalAlongTrackdir(trackdir))   SETBIT(signal_dir, 0);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   861
	if (signals & SignalAgainstTrackdir(trackdir)) SETBIT(signal_dir, 1);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   862
1954
2beb56cfddbb (svn r2460) - Fix: Prevent assertion failure when trying to drag signals starting from a non-rail tile.
hackykid
parents: 1946
diff changeset
   863
	/* signal_ctr         - amount of tiles already processed
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   864
	 * signals_density    - patch setting to put signal on every Nth tile (double space on |, -- tracks)
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   865
	 **********
1954
2beb56cfddbb (svn r2460) - Fix: Prevent assertion failure when trying to drag signals starting from a non-rail tile.
hackykid
parents: 1946
diff changeset
   866
	 * trackdir   - trackdir to build with autorail
2beb56cfddbb (svn r2460) - Fix: Prevent assertion failure when trying to drag signals starting from a non-rail tile.
hackykid
parents: 1946
diff changeset
   867
	 * semaphores - semaphores or signals
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
   868
	 * signals    - is there a signal/semaphore on the first tile, copy its style (two-way/single-way)
4549
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4483
diff changeset
   869
	 *              and convert all others to semaphore/signal
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   870
	 * remove     - 1 remove signals, 0 build signals */
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   871
	signal_ctr = 0;
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   872
	for (;;) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
   873
		/* only build/remove signals with the specified density */
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   874
		if ((remove && autofill) || signal_ctr % signal_density == 0) {
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   875
			uint32 p1 = GB(TrackdirToTrack(trackdir), 0, 3);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   876
			SB(p1, 3, 1, mode);
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   877
			SB(p1, 4, 1, semaphores);
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   878
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   879
			/* Pick the correct orientation for the track direction */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   880
			signals = 0;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   881
			if (HASBIT(signal_dir, 0)) signals |= SignalAlongTrackdir(trackdir);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   882
			if (HASBIT(signal_dir, 1)) signals |= SignalAgainstTrackdir(trackdir);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   883
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   884
			ret = DoCommand(tile, p1, signals, flags, remove ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS);
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   885
5069
68beabd19dca (svn r7127) -Codechange [FS#149]: Improve the usability of the signal-dragger, do not bail out
Darkvater
parents: 5059
diff changeset
   886
			/* Be user-friendly and try placing signals as much as possible */
6946
a48b23f1cc8a (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 6943
diff changeset
   887
			if (CmdSucceeded(ret)) {
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   888
				error = false;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   889
				total_cost.AddCost(ret);
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   890
			}
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   891
		}
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   892
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   893
		if (autofill) {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   894
			if (!CheckSignalAutoFill(tile, trackdir, signal_ctr, remove)) break;
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   895
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   896
			/* Prevent possible loops */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   897
			if (tile == start_tile && trackdir == start_trackdir) break;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   898
		} else {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   899
			if (tile == end_tile) break;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   900
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   901
			tile += ToTileIndexDiff(_trackdelta[trackdir]);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   902
			signal_ctr++;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   903
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   904
			/* toggle railbit for the non-diagonal tracks (|, -- tracks) */
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   905
			if (IsDiagonalTrackdir(trackdir)) {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   906
				signal_ctr++;
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   907
			} else {
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   908
				ToggleBitT(trackdir, 0);
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   909
			}
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   910
		}
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   911
	}
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   912
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
   913
	return error ? CMD_ERROR : total_cost;
58
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   914
}
b9fdcc9b5c90 (svn r59) -Feature: Added Autosignals, just like Autorail. Can copy signal style, convert signal<->semaphore, etc. Big thanks to betatesters Dribbel and Testman57 (Darkvater)
darkvater
parents: 39
diff changeset
   915
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   916
/** Build signals on a stretch of track.
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   917
 * Stub for the unified signal builder/remover
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   918
 * @param tile start tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   919
 * @param flags operation to perform
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   920
 * @param p1  end tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   921
 * @param p2 various bitstuffed elements
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   922
 * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   923
 * - p2 = (bit  3)    - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   924
 * - p2 = (bit  4)    - 0 = signals, 1 = semaphores
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   925
 * - p2 = (bit  5)    - 0 = build, 1 = remove signals
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   926
 * - p2 = (bit  6)    - 0 = selected stretch, 1 = auto fill
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   927
 * - p2 = (bit 24-31) - user defined signals_density
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   928
 * @see CmdSignalTrackHelper
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   929
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   930
CommandCost CmdBuildSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   931
{
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   932
	return CmdSignalTrackHelper(tile, flags, p1, p2);
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   933
}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   934
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   935
/** Remove signals
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
   936
 * @param tile coordinates where signal is being deleted from
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   937
 * @param flags operation to perform
6488
b6c42e91bb35 (svn r9669) -Documentation: some more doxygen fixes
belugas
parents: 6483
diff changeset
   938
 * @param p1 various bitstuffed elements, only track information is used
b6c42e91bb35 (svn r9669) -Documentation: some more doxygen fixes
belugas
parents: 6483
diff changeset
   939
 *           - (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
b6c42e91bb35 (svn r9669) -Documentation: some more doxygen fixes
belugas
parents: 6483
diff changeset
   940
 *           - (bit  3)    - override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
b6c42e91bb35 (svn r9669) -Documentation: some more doxygen fixes
belugas
parents: 6483
diff changeset
   941
 *           - (bit  4)    - 0 = signals, 1 = semaphores
b6c42e91bb35 (svn r9669) -Documentation: some more doxygen fixes
belugas
parents: 6483
diff changeset
   942
 * @param p2 unused
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   943
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   944
CommandCost CmdRemoveSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   945
{
5735
9f3729784816 (svn r8279) -Regression (r8274): Removing signals could fail under certain circumstances (not the proper bits of p1/p2 were set to trackbits). Moved trackbits back to bits 0..2, ctrl to 3, semaphore to 4. Also lower the decision of the ctrl-override of signal/semaphore from the GUI into the cmd function since we are passing the ctrl-bit anyways. Bug(s) found by Frostregen; thanks
Darkvater
parents: 5731
diff changeset
   946
	Track track = (Track)GB(p1, 0, 3);
1518
9a876c45238b (svn r2022) Revise CmdRemoveSingleSignal: Check parameters for validity and simplify the function
tron
parents: 1477
diff changeset
   947
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   948
	if (!ValParamTrackOrientation(track) ||
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   949
			!IsTileType(tile, MP_RAILWAY) ||
6406
8ccf18e94c67 (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: 6393
diff changeset
   950
			!EnsureNoVehicleOnGround(tile) ||
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   951
			!HasSignalOnTrack(tile, track)) {
1518
9a876c45238b (svn r2022) Revise CmdRemoveSingleSignal: Check parameters for validity and simplify the function
tron
parents: 1477
diff changeset
   952
		return CMD_ERROR;
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
   953
	}
1518
9a876c45238b (svn r2022) Revise CmdRemoveSingleSignal: Check parameters for validity and simplify the function
tron
parents: 1477
diff changeset
   954
1775
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   955
	/* Only water can remove signals from anyone */
548dc04d50e2 (svn r2279) - Fix: Check the parameters of the first 10 Commands. While there also add proper comments for the functions and fix up CmdFailed()
Darkvater
parents: 1719
diff changeset
   956
	if (_current_player != OWNER_WATER && !CheckTileOwnership(tile)) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   957
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   958
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   959
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   960
	/* Do it? */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   961
	if (flags & DC_EXEC) {
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   962
		SetPresentSignals(tile, GetPresentSignals(tile) & ~SignalOnTrack(track));
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   963
1066
eaef1465d3ab (svn r1567) -Fix: [110452] On horizontal/vertical tracks you are also charged for building/removing signals on the parallel track on the same tile. Signal updating is also correct. (Hackykid)
darkvater
parents: 1059
diff changeset
   964
		/* removed last signal from tile? */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   965
		if (GetPresentSignals(tile) == 0) {
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
   966
			SetSignalStates(tile, 0);
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
   967
			SetHasSignals(tile, false);
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
   968
			SetSignalVariant(tile, INVALID_TRACK, SIG_ELECTRIC); // remove any possible semaphores
1066
eaef1465d3ab (svn r1567) -Fix: [110452] On horizontal/vertical tracks you are also charged for building/removing signals on the parallel track on the same tile. Signal updating is also correct. (Hackykid)
darkvater
parents: 1059
diff changeset
   969
		}
1109
ecb98f43ba2c (svn r1610) Remove trailing whitespace (last time ever, i hope)
tron
parents: 1095
diff changeset
   970
1066
eaef1465d3ab (svn r1567) -Fix: [110452] On horizontal/vertical tracks you are also charged for building/removing signals on the parallel track on the same tile. Signal updating is also correct. (Hackykid)
darkvater
parents: 1059
diff changeset
   971
		SetSignalsOnBothDir(tile, track);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
   972
		YapfNotifyTrackLayoutChange(tile, track);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   973
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   974
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   975
	}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
   976
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
   977
	return CommandCost(_price.remove_signals);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   978
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   979
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   980
/** Remove signals on a stretch of track.
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   981
 * Stub for the unified signal builder/remover
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   982
 * @param tile start tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   983
 * @param flags operation to perform
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   984
 * @param p1  end tile of drag
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   985
 * @param p2 various bitstuffed elements
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   986
 * - p2 = (bit  0- 2) - track-orientation, valid values: 0-5 (Track enum)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   987
 * - p2 = (bit  3)    - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   988
 * - p2 = (bit  4)    - 0 = signals, 1 = semaphores
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   989
 * - p2 = (bit  5)    - 0 = build, 1 = remove signals
7163
99ef91ad6415 (svn r10437) -Feature: Automatic signal completion, enabled by pressing ctrl when dragging signals. Signals will continue following track until an existing signal, junction or station are reached. This currently replaces the existing use of ctrl-drag for changing existing signal type.
peter1138
parents: 7158
diff changeset
   990
 * - p2 = (bit  6)    - 0 = selected stretch, 1 = auto fill
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
   991
 * - p2 = (bit 24-31) - user defined signals_density
1796
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   992
 * @see CmdSignalTrackHelper
614d996f6be7 (svn r2300) - CodeChange: check the last number of commands, now only the refit ones remain, and some server-only commands.
Darkvater
parents: 1782
diff changeset
   993
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   994
CommandCost CmdRemoveSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   995
{
5731
c68613da5c4d (svn r8274) -Codechange (r8151): Move the automatic semaphore/signal checks inside the CMD_ functions where they are supposed to be. Achieve this by adding a seperate bit to p1/p2 to hold the CTRL-modifier. While here, use proper types, and 'unify' the parameter bit-meanings. 0 - ctrl-pressed, 1 - signal/semaphore, 2-4 - trackbits, 5 - remove (internal), 24-31 - drag density.
Darkvater
parents: 5668
diff changeset
   996
	return CmdSignalTrackHelper(tile, flags, p1, SETBIT(p2, 5)); // bit 5 is remove bit
1227
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   997
}
1d940a5e02d2 (svn r1731) - Fix: [ 1106930 ] BugFix: placing signals with 2x1 drags workaround is completely rewritten. Also features checks for hacked/modified clients. Thanks a lot Hackykid!
darkvater
parents: 1209
diff changeset
   998
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
   999
typedef CommandCost DoConvertRailProc(TileIndex tile, RailType totype, bool exec);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1000
6368
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1001
/**
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1002
 * Switches the rail type.
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1003
 * Railtypes are stored on a per-tile basis, not on a per-track basis, so
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1004
 * all the tracks in the given tile will be converted.
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1005
 * @param tile        The tile on which the railtype is to be convert.
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1006
 * @param totype      The railtype we want to convert to
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1007
 * @param exec        Switches between test and execute mode
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1008
 * @return            The cost and state of the operation
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1009
 * @retval CMD_ERROR  An error occured during the operation.
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1010
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1011
static CommandCost DoConvertRail(TileIndex tile, RailType totype, bool exec)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1012
{
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3333
diff changeset
  1013
	if (!CheckTileOwnership(tile)) return CMD_ERROR;
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3333
diff changeset
  1014
6368
c58210a58402 (svn r9425) -Codechange/Fix (FS#689): Housekeeping in the convert rail functions: Changed the order of error checks to generate more meaningful error messages, added some doxygen comments and replaced bitshifting by proper mathematical operations
celestar
parents: 6357
diff changeset
  1015
	if (GetRailType(tile) == totype) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1016
6406
8ccf18e94c67 (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: 6393
diff changeset
  1017
	if (!EnsureNoVehicleOnGround(tile) && (!IsCompatibleRail(GetRailType(tile), totype) || IsPlainRailTile(tile))) return CMD_ERROR;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1018
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1019
	/* 'hidden' elrails can't be downgraded to normal rail when elrails are disabled */
5116
3c0c3da214ca (svn r7195) -Feature: [FS#297, optional elrails] New patches/vehicles option 'disable electrified railways'.
KUDr
parents: 5069
diff changeset
  1020
	if (_patches.disable_elrails && totype == RAILTYPE_RAIL && GetRailType(tile) == RAILTYPE_ELECTRIC) return CMD_ERROR;
3c0c3da214ca (svn r7195) -Feature: [FS#297, optional elrails] New patches/vehicles option 'disable electrified railways'.
KUDr
parents: 5069
diff changeset
  1021
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1022
	/* change type. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1023
	if (exec) {
3242
4c32bf21153b (svn r3916) Get/Set the rail type by [GS]etRailType{Crossing,OnBridge,}()
tron
parents: 3238
diff changeset
  1024
		SetRailType(tile, totype);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1025
		MarkTileDirtyByTile(tile);
3869
0467c594dfb5 (svn r4906) - Fix: Refresh build vehicle window (if opened) when converting rail depot
glx
parents: 3794
diff changeset
  1026
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1027
		/* notify YAPF about the track layout change */
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1028
		TrackBits tracks = GetTrackBits(tile);
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1029
		while (tracks != TRACK_BIT_NONE) {
5598
2fadbd43709d (svn r8052) - Codechange: RemoveFirstTrack() and RemoveFirstTrackdir() now accept pointer to TrackBits/TrackdirBits instead of reference.
KUDr
parents: 5587
diff changeset
  1030
			YapfNotifyTrackLayoutChange(tile, RemoveFirstTrack(&tracks));
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1031
		}
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1032
3869
0467c594dfb5 (svn r4906) - Fix: Refresh build vehicle window (if opened) when converting rail depot
glx
parents: 3794
diff changeset
  1033
		if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
4556
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1034
			Vehicle *v;
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1035
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1036
			/* Update build vehicle window related to this depot */
4792
a6fa5fc79715 (svn r6714) -Codechange: replaced a direct manipulation of windows with InvalidateWindowData() in rail_cmd.c
bjarni
parents: 4790
diff changeset
  1037
			InvalidateWindowData(WC_BUILD_VEHICLE, tile);
4556
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1038
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1039
			/* update power of trains in this depot */
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1040
			FOR_ALL_VEHICLES(v) {
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  1041
				if (v->type == VEH_TRAIN && IsFrontEngine(v) && v->tile == tile && v->u.rail.track == 0x80) {
4556
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1042
					TrainPowerChanged(v);
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1043
				}
cb82978e84ed (svn r6395) -Fix: when converting a depot from/to elrail, update the power of trains that are in it
glx
parents: 4549
diff changeset
  1044
			}
3869
0467c594dfb5 (svn r4906) - Fix: Refresh build vehicle window (if opened) when converting rail depot
glx
parents: 3794
diff changeset
  1045
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1046
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1047
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1048
	return CommandCost(_price.build_rail / 2);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1049
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1050
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1051
extern CommandCost DoConvertStationRail(TileIndex tile, RailType totype, bool exec);
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1052
extern CommandCost DoConvertStreetRail(TileIndex tile, RailType totype, bool exec);
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1053
extern CommandCost DoConvertTunnelBridgeRail(TileIndex tile, RailType totype, bool exec);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1054
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1055
/** Convert one rail type to the other. You can convert normal rail to
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1056
 * monorail/maglev easily or vice-versa.
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
  1057
 * @param tile end tile of rail conversion drag
6483
ae78fc3c6b20 (svn r9664) -Documentation: Doxygen corrections,errors and omissions
belugas
parents: 6452
diff changeset
  1058
 * @param flags operation to perform
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1059
 * @param p1 start tile of drag
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1060
 * @param p2 new railtype to convert to
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1061
 */
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1062
CommandCost CmdConvertRail(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1063
{
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1064
	CommandCost ret, cost;
6990
136a08baf0ed (svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents: 6950
diff changeset
  1065
	Money money;
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
  1066
	int ex;
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
  1067
	int ey;
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1068
	int sx, sy, x, y;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1069
889
64d2f7d5f02b (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: 826
diff changeset
  1070
	SET_EXPENSES_TYPE(EXPENSES_CONSTRUCTION);
64d2f7d5f02b (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: 826
diff changeset
  1071
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1072
	if (!ValParamRailtype(p2)) return CMD_ERROR;
2934
3f29a7212713 (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
  1073
	if (p1 >= MapSize()) return CMD_ERROR;
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1074
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1075
	/* make sure sx,sy are smaller than ex,ey */
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1076
	ex = TileX(tile);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1077
	ey = TileY(tile);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1078
	sx = TileX(p1);
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1079
	sy = TileY(p1);
6106
2898cd9417fd (svn r8841) -Fix
tron
parents: 5993
diff changeset
  1080
	if (ex < sx) Swap(ex, sx);
2898cd9417fd (svn r8841) -Fix
tron
parents: 5993
diff changeset
  1081
	if (ey < sy) Swap(ey, sy);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1082
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1083
	money = GetAvailableMoneyForCommand();
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1084
3493
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1085
	for (x = sx; x <= ex; ++x) {
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1086
		for (y = sy; y <= ey; ++y) {
c77bcf04294d (svn r4344) Use tile coordinates or even TileIndices instead of virtual tile coordinates where it suffices.
tron
parents: 3491
diff changeset
  1087
			TileIndex tile = TileXY(x, y);
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1088
			DoConvertRailProc* proc;
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1089
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1090
			switch (GetTileType(tile)) {
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1091
				case MP_RAILWAY:      proc = DoConvertRail;             break;
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1092
				case MP_STATION:      proc = DoConvertStationRail;      break;
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1093
				case MP_STREET:       proc = DoConvertStreetRail;       break;
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1094
				case MP_TUNNELBRIDGE: proc = DoConvertTunnelBridgeRail; break;
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1095
				default: continue;
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1096
			}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1097
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1098
			ret = proc(tile, (RailType)p2, false);
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1099
			if (CmdFailed(ret)) continue;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1100
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1101
			if (flags & DC_EXEC) {
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1102
				money -= ret.GetCost();
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1103
				if (money < 0) {
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1104
					_additional_cash_required = ret.GetCost();
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1105
					return cost;
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1106
				}
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1107
				proc(tile, (RailType)p2, true);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1108
			}
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1109
			cost.AddCost(ret);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1110
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1111
	}
1782
48749e4c2dc6 (svn r2286) - CodeChange: paramcheck the next batch of commands.
Darkvater
parents: 1781
diff changeset
  1112
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1113
	return (cost.GetCost() == 0) ? ret : cost;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1114
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1115
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1116
static CommandCost RemoveTrainDepot(TileIndex tile, uint32 flags)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1117
{
149
5f7d4b21df01 (svn r150) -Fix: [1010833] Turning on the magic bulldozer removes oil rigs
darkvater
parents: 84
diff changeset
  1118
	if (!CheckTileOwnership(tile) && _current_player != OWNER_WATER)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1119
		return CMD_ERROR;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1120
6406
8ccf18e94c67 (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: 6393
diff changeset
  1121
	if (!EnsureNoVehicleOnGround(tile))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1122
		return CMD_ERROR;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1123
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1124
	if (flags & DC_EXEC) {
3191
b2bebf380cd7 (svn r3851) Rail depots only have an entrance at one side, therefore use UpdateSignalsOnSegment() instead of SetSignalsOnBothDir()
tron
parents: 3189
diff changeset
  1125
		DiagDirection dir = GetRailDepotDirection(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1126
4388
c8a66d26e146 (svn r6141) -Codechange: introduced DepotID and used it as much as possible
truelight
parents: 4344
diff changeset
  1127
		DeleteDepot(GetDepotByTile(tile));
3191
b2bebf380cd7 (svn r3851) Rail depots only have an entrance at one side, therefore use UpdateSignalsOnSegment() instead of SetSignalsOnBothDir()
tron
parents: 3189
diff changeset
  1128
		UpdateSignalsOnSegment(tile, dir);
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1129
		YapfNotifyTrackLayoutChange(tile, TrackdirToTrack(DiagdirToDiagTrackdir(dir)));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1130
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1131
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1132
	return CommandCost(_price.remove_train_depot);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1133
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1134
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1135
static CommandCost ClearTile_Track(TileIndex tile, byte flags)
1534
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1136
{
6943
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1137
	CommandCost cost;
1914f26aee04 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 6791
diff changeset
  1138
	CommandCost ret;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1139
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1140
	if (flags & DC_AUTO) {
1901
03bf9bf99319 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
  1141
		if (!IsTileOwner(tile, _current_player))
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1142
			return_cmd_error(STR_1024_AREA_IS_OWNED_BY_ANOTHER);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1143
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1144
		if (IsPlainRailTile(tile)) {
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1145
			return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1146
		} else {
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1147
			return_cmd_error(STR_2004_BUILDING_MUST_BE_DEMOLISHED);
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1148
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1149
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1150
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
  1151
	switch (GetRailTileType(tile)) {
3792
67c865c9315c (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: 3778
diff changeset
  1152
		case RAIL_TILE_SIGNALS:
67c865c9315c (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: 3778
diff changeset
  1153
		case RAIL_TILE_NORMAL: {
5414
6469dbacdab8 (svn r7617) -Fix (7609): GetTrackBits only works (as intended) for plain rail tiles, so get the trackbits if it is certain it is a plain rail tile. Noticed by Tron.
rubidium
parents: 5411
diff changeset
  1154
			TrackBits tracks = GetTrackBits(tile);
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1155
			while (tracks != TRACK_BIT_NONE) {
5598
2fadbd43709d (svn r8052) - Codechange: RemoveFirstTrack() and RemoveFirstTrackdir() now accept pointer to TrackBits/TrackdirBits instead of reference.
KUDr
parents: 5587
diff changeset
  1156
				Track track = RemoveFirstTrack(&tracks);
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1157
				ret = DoCommand(tile, 0, track, flags, CMD_REMOVE_SINGLE_RAIL);
5411
9ad8285b2f0d (svn r7609) -Codechange: remove some direct map accesses to m5 and some unneeded signal removal code in ClearTileTrack as it is done in CmdRemoveSingleRail too, which is called for every removed trackbit.
rubidium
parents: 5394
diff changeset
  1158
				if (CmdFailed(ret)) return CMD_ERROR;
6950
14ecb0acdfb4 (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 6946
diff changeset
  1159
				cost.AddCost(ret);
1534
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1160
			}
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1161
			return cost;
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1162
		}
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1163
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1164
		case RAIL_TILE_DEPOT:
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1165
			return RemoveTrainDepot(tile, flags);
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1166
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1167
		case RAIL_TILE_WAYPOINT:
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1168
			return RemoveTrainWaypoint(tile, flags, false);
1534
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1169
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1170
		default:
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1171
			return CMD_ERROR;
304124d6b5e3 (svn r2038) -Fix: A player only received the money for one rail when clearing a tile with 2 rails and signals
tron
parents: 1518
diff changeset
  1172
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1173
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1174
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1175
#include "table/track_land.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1176
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1177
static void DrawSingleSignal(TileIndex tile, Track track, byte condition, uint image, uint pos)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1178
{
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1179
	bool side = (_opt.road_side != 0) && _patches.signal_side;
3502
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1180
	static const Point SignalPositions[2][12] = {
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1181
		{      /* Signals on the left side */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1182
		/*  LEFT      LEFT      RIGHT     RIGHT     UPPER     UPPER */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1183
			{ 8,  5}, {14,  1}, { 1, 14}, { 9, 11}, { 1,  0}, { 3, 10},
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1184
		/*  LOWER     LOWER     X         X         Y         Y     */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1185
			{11,  4}, {14, 14}, {11,  3}, { 4, 13}, { 3,  4}, {11, 13}
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1186
		}, {   /* Signals on the right side */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1187
		/*  LEFT      LEFT      RIGHT     RIGHT     UPPER     UPPER */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1188
			{14,  1}, {12, 10}, { 4,  6}, { 1, 14}, {10,  4}, { 0,  1},
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1189
		/*  LOWER     LOWER     X         X         Y         Y     */
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1190
			{14, 14}, { 5, 12}, {11, 13}, { 4,  3}, {13,  4}, { 3, 11}
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1191
		}
b747d7225871 (svn r4353) Codechange: Move global _signal_position into the only function that uses it and convert the bit-hacking into a struct
celestar
parents: 3493
diff changeset
  1192
	};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1193
3506
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1194
	static const SpriteID SignalBase[2][2][4] = {
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1195
		{    /* Signals on left side */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1196
			{  0x4FB, 0x1323, 0x1333, 0x1343}, /* light signals */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1197
			{ 0x1353, 0x1363, 0x1373, 0x1383}  /* semaphores    */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1198
		}, { /* Signals on right side */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1199
			{  0x4FB, 0x1323, 0x1333, 0x1343}, /* light signals */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1200
			{ 0x1446, 0x1456, 0x1466, 0x1476}  /* semaphores    */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1201
		/*         |       |       |       |     */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1202
		/*    normal,  entry,   exit,  combo     */
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1203
		}
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1204
	};
226b7faabe40 (svn r4357) -Codechange: Moved global _signal_base_sprites into the only function where it is used and use a better array arrangement for it
celestar
parents: 3503
diff changeset
  1205
3575
f5b56bd958c0 (svn r4461) -Codechange: Add and make use of map accessor functions for signal drawing. Includes some basic cleanup of the drawing functions
celestar
parents: 3562
diff changeset
  1206
	uint x = TileX(tile) * TILE_SIZE + SignalPositions[side][pos].x;
f5b56bd958c0 (svn r4461) -Codechange: Add and make use of map accessor functions for signal drawing. Includes some basic cleanup of the drawing functions
celestar
parents: 3562
diff changeset
  1207
	uint y = TileY(tile) * TILE_SIZE + SignalPositions[side][pos].y;
f5b56bd958c0 (svn r4461) -Codechange: Add and make use of map accessor functions for signal drawing. Includes some basic cleanup of the drawing functions
celestar
parents: 3562
diff changeset
  1208
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1209
	SpriteID sprite;
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1210
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1211
	/* _signal_base is set by our NewGRF Action 5 loader. If it is 0 then we
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1212
	 * just draw the standard signals, else we get the offset from _signal_base
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1213
	 * and draw that sprite. All the signal sprites are loaded sequentially. */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1214
	if (_signal_base == 0 || (GetSignalType(tile, track) == SIGTYPE_NORMAL && GetSignalVariant(tile, track) == SIG_ELECTRIC)) {
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1215
		sprite = SignalBase[side][GetSignalVariant(tile, track)][GetSignalType(tile, track)] + image + condition;
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1216
	} else {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1217
		sprite = _signal_base + (GetSignalType(tile, track) - 1) * 16 + GetSignalVariant(tile, track) * 64 + image + condition;
3638
3e655c6e0914 (svn r4546) - NewGRF: add support for Action 0x05, type 0x04: replacement signal graphics. Thanks to Purno for supplying data to test
peter1138
parents: 3636
diff changeset
  1218
	}
3575
f5b56bd958c0 (svn r4461) -Codechange: Add and make use of map accessor functions for signal drawing. Includes some basic cleanup of the drawing functions
celestar
parents: 3562
diff changeset
  1219
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1220
	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, 10, GetSlopeZ(x,y));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1221
}
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
static uint32 _drawtile_track_palette;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1224
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1225
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1226
static void DrawTrackFence_NW(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1227
{
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1228
	SpriteID image = SPR_TRACK_FENCE_FLAT_X;
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1229
	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SW : SPR_TRACK_FENCE_SLOPE_NE;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1230
	AddSortableSpriteToDraw(image, _drawtile_track_palette,
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1231
		ti->x, ti->y + 1, 16, 1, 4, ti->z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1232
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1233
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1234
static void DrawTrackFence_SE(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1235
{
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1236
	SpriteID image = SPR_TRACK_FENCE_FLAT_X;
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1237
	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SW : SPR_TRACK_FENCE_SLOPE_NE;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1238
	AddSortableSpriteToDraw(image, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1239
		ti->x, ti->y + TILE_SIZE - 1, 16, 1, 4, ti->z);
0
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
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1242
static void DrawTrackFence_NW_SE(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1243
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1244
	DrawTrackFence_NW(ti);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1245
	DrawTrackFence_SE(ti);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1246
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1247
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1248
static void DrawTrackFence_NE(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1249
{
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1250
	SpriteID image = SPR_TRACK_FENCE_FLAT_Y;
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1251
	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SE : SPR_TRACK_FENCE_SLOPE_NW;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1252
	AddSortableSpriteToDraw(image, _drawtile_track_palette,
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1253
		ti->x + 1, ti->y, 1, 16, 4, ti->z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1254
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1255
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1256
static void DrawTrackFence_SW(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
{
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1258
	SpriteID image = SPR_TRACK_FENCE_FLAT_Y;
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1259
	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? SPR_TRACK_FENCE_SLOPE_SE : SPR_TRACK_FENCE_SLOPE_NW;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1260
	AddSortableSpriteToDraw(image, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1261
		ti->x + TILE_SIZE - 1, ti->y, 1, 16, 4, ti->z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1262
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1263
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1264
static void DrawTrackFence_NE_SW(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1266
	DrawTrackFence_NE(ti);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1267
	DrawTrackFence_SW(ti);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1268
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1269
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1270
/**
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1271
 * Draw fence at eastern side of track.
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1272
 */
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1273
static void DrawTrackFence_NS_1(const TileInfo *ti)
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
	int z = ti->z;
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1276
	if (ti->tileh & SLOPE_W) z += TILE_HEIGHT;
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1277
	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1278
		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1279
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1280
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1281
/**
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1282
 * Draw fence at western side of track.
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1283
 */
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1284
static void DrawTrackFence_NS_2(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1285
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1286
	int z = ti->z;
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1287
	if (ti->tileh & SLOPE_E) z += TILE_HEIGHT;
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1288
	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_VERT, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1289
		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1290
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1291
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1292
/**
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1293
 * Draw fence at southern side of track.
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1294
 */
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1295
static void DrawTrackFence_WE_1(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1296
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1297
	int z = ti->z;
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1298
	if (ti->tileh & SLOPE_N) z += TILE_HEIGHT;
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1299
	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1300
		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1301
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1302
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1303
/**
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1304
 * Draw fence at northern side of track.
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1305
 */
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  1306
static void DrawTrackFence_WE_2(const TileInfo *ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1307
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1308
	int z = ti->z;
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1309
	if (ti->tileh & SLOPE_S) z += TILE_HEIGHT;
7307
9f8922176b67 (svn r10659) -Codechange: updated documentation around RAIL_GROUND_FENCE_VERT[12] (frosch)
truelight
parents: 7272
diff changeset
  1310
	AddSortableSpriteToDraw(SPR_TRACK_FENCE_FLAT_HORZ, _drawtile_track_palette,
3645
7f950533d510 (svn r4554) Replace magic numbers by TILE_{HEIGHT,SIZE}
tron
parents: 3638
diff changeset
  1311
		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1312
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1313
4040
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1314
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1315
static void DrawTrackDetails(const TileInfo* ti)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1316
{
4040
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1317
	switch (GetRailGroundType(ti->tile)) {
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1318
		case RAIL_GROUND_FENCE_NW:     DrawTrackFence_NW(ti);    break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1319
		case RAIL_GROUND_FENCE_SE:     DrawTrackFence_SE(ti);    break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1320
		case RAIL_GROUND_FENCE_SENW:   DrawTrackFence_NW_SE(ti); break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1321
		case RAIL_GROUND_FENCE_NE:     DrawTrackFence_NE(ti);    break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1322
		case RAIL_GROUND_FENCE_SW:     DrawTrackFence_SW(ti);    break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1323
		case RAIL_GROUND_FENCE_NESW:   DrawTrackFence_NE_SW(ti); break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1324
		case RAIL_GROUND_FENCE_VERT1:  DrawTrackFence_NS_1(ti);  break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1325
		case RAIL_GROUND_FENCE_VERT2:  DrawTrackFence_NS_2(ti);  break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1326
		case RAIL_GROUND_FENCE_HORIZ1: DrawTrackFence_WE_1(ti);  break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1327
		case RAIL_GROUND_FENCE_HORIZ2: DrawTrackFence_WE_2(ti);  break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1328
		default: break;
921eabdb0283 (svn r5308) Replace an array of function pointers with a switch: It's shorter, more comprehensible, less dependent on magic numbers
tron
parents: 4000
diff changeset
  1329
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1330
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1331
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1332
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1333
/**
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1334
 * Draw ground sprite and track bits
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1335
 * @param ti TileInfo
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1336
 * @param track TrackBits to draw
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1337
 */
4081
46f02386923e (svn r5396) - Remove two fixed parameters
tron
parents: 4077
diff changeset
  1338
static void DrawTrackBits(TileInfo* ti, TrackBits track)
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1339
{
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1340
	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1341
	SpriteID image;
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1342
	SpriteID pal = PAL_NONE;
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1343
	bool junction = false;
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1344
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1345
	/* Select the sprite to use. */
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1346
	(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1347
	(image++,                           track == TRACK_BIT_X) ||
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1348
	(image++,                           track == TRACK_BIT_UPPER) ||
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1349
	(image++,                           track == TRACK_BIT_LOWER) ||
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1350
	(image++,                           track == TRACK_BIT_RIGHT) ||
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1351
	(image++,                           track == TRACK_BIT_LEFT) ||
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1352
	(image++,                           track == TRACK_BIT_CROSS) ||
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1353
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1354
	(image = rti->base_sprites.track_ns, track == TRACK_BIT_HORZ) ||
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1355
	(image++,                            track == TRACK_BIT_VERT) ||
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1356
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1357
	(junction = true, false) ||
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1358
	(image = rti->base_sprites.ground, (track & TRACK_BIT_3WAY_NE) == 0) ||
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1359
	(image++,                          (track & TRACK_BIT_3WAY_SW) == 0) ||
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1360
	(image++,                          (track & TRACK_BIT_3WAY_NW) == 0) ||
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1361
	(image++,                          (track & TRACK_BIT_3WAY_SE) == 0) ||
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1362
	(image++, true);
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1363
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1364
	if (ti->tileh != SLOPE_FLAT) {
4081
46f02386923e (svn r5396) - Remove two fixed parameters
tron
parents: 4077
diff changeset
  1365
		uint foundation = GetRailFoundation(ti->tileh, track);
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1366
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
  1367
		if (foundation != 0) DrawFoundation(ti, foundation);
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1368
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1369
		/* DrawFoundation() modifies it.
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1370
		 * Default sloped sprites.. */
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1371
		if (ti->tileh != SLOPE_FLAT)
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1372
			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1373
	}
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1374
4466
903dcec7aa88 (svn r6251) Replace 2 bool variables by a simple switch
tron
parents: 4440
diff changeset
  1375
	switch (GetRailGroundType(ti->tile)) {
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1376
		case RAIL_GROUND_BARREN:     pal = PALETTE_TO_BARE_LAND; break;
4466
903dcec7aa88 (svn r6251) Replace 2 bool variables by a simple switch
tron
parents: 4440
diff changeset
  1377
		case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset; break;
903dcec7aa88 (svn r6251) Replace 2 bool variables by a simple switch
tron
parents: 4440
diff changeset
  1378
		default: break;
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1379
	}
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1380
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1381
	DrawGroundSprite(image, pal);
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1382
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1383
	/* Draw track pieces individually for junction tiles */
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1384
	if (junction) {
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1385
		if (track & TRACK_BIT_X)     DrawGroundSprite(rti->base_sprites.single_y, PAL_NONE);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1386
		if (track & TRACK_BIT_Y)     DrawGroundSprite(rti->base_sprites.single_x, PAL_NONE);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1387
		if (track & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n, PAL_NONE);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1388
		if (track & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s, PAL_NONE);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1389
		if (track & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w, PAL_NONE);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1390
		if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e, PAL_NONE);
2472
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1391
	}
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1392
}
2711a54b0498 (svn r2998) -Codechange: Split rail drawing code off from DrawTile_Rail into a separate function to be used elsewhere. (Deja vu?)
peter1138
parents: 2436
diff changeset
  1393
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1394
static void DrawSignals(TileIndex tile, TrackBits rails)
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1395
{
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1396
#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y - 0x4FB, z)
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1397
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1398
	if (!(rails & TRACK_BIT_Y)) {
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1399
		if (!(rails & TRACK_BIT_X)) {
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1400
			if (rails & TRACK_BIT_LEFT) {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1401
				MAYBE_DRAW_SIGNAL(2, 0x509, 0, TRACK_LEFT);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1402
				MAYBE_DRAW_SIGNAL(3, 0x507, 1, TRACK_LEFT);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1403
			}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1404
			if (rails & TRACK_BIT_RIGHT) {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1405
				MAYBE_DRAW_SIGNAL(0, 0x509, 2, TRACK_RIGHT);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1406
				MAYBE_DRAW_SIGNAL(1, 0x507, 3, TRACK_RIGHT);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1407
			}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1408
			if (rails & TRACK_BIT_UPPER) {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1409
				MAYBE_DRAW_SIGNAL(3, 0x505, 4, TRACK_UPPER);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1410
				MAYBE_DRAW_SIGNAL(2, 0x503, 5, TRACK_UPPER);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1411
			}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1412
			if (rails & TRACK_BIT_LOWER) {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1413
				MAYBE_DRAW_SIGNAL(1, 0x505, 6, TRACK_LOWER);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1414
				MAYBE_DRAW_SIGNAL(0, 0x503, 7, TRACK_LOWER);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1415
			}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1416
		} else {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1417
			MAYBE_DRAW_SIGNAL(3, 0x4FB, 8, TRACK_X);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1418
			MAYBE_DRAW_SIGNAL(2, 0x4FD, 9, TRACK_X);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1419
		}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1420
	} else {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1421
		MAYBE_DRAW_SIGNAL(3, 0x4FF, 10, TRACK_Y);
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1422
		MAYBE_DRAW_SIGNAL(2, 0x501, 11, TRACK_Y);
3519
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1423
	}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1424
}
1b8eb174e528 (svn r4375) -Codechange: Move the signal drawing bit to an own function and rename DrawSignalHelper to DrawSingleSignal
celestar
parents: 3507
diff changeset
  1425
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1426
static void DrawTile_Track(TileInfo *ti)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1427
{
2233
ee31c1e1477c (svn r2753) -Codechange: Introduced a new struct "RailtypeInfo" to store rail type specific information. Begun populating it with a bunch of sprites, more to come later. This should result in cleaner, more compact code which allows easy introduction of new railtypes.
celestar
parents: 2187
diff changeset
  1428
	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1429
	SpriteID image;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1430
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1431
	_drawtile_track_palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1432
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1433
	if (IsPlainRailTile(ti->tile)) {
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
  1434
		TrackBits rails = GetTrackBits(ti->tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1435
4081
46f02386923e (svn r5396) - Remove two fixed parameters
tron
parents: 4077
diff changeset
  1436
		DrawTrackBits(ti, rails);
2008
cdb444f6d43c (svn r2516) - Feature: [pbs] Implement path-based-signalling. This allows multiple trains within the same signal block, provided their paths dont intersect. For this the block must have all exit and entry signals be pbs signals. Place these by ctrl-clicking 4 times on a normal signal.
hackykid
parents: 2007
diff changeset
  1437
6591
514c1a22e10e (svn r9805) -Codechange: Use HASBIT() et al for display options bits.
peter1138
parents: 6488
diff changeset
  1438
		if (HASBIT(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1439
7043
842b2bc47729 (svn r10308) -Codechange: some "cleanup" chunks from B. N. SmatZ!' work on fixing FS#119.
rubidium
parents: 6990
diff changeset
  1440
		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
842b2bc47729 (svn r10308) -Codechange: some "cleanup" chunks from B. N. SmatZ!' work on fixing FS#119.
rubidium
parents: 6990
diff changeset
  1441
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1442
		if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1443
	} else {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1444
		/* draw depot/waypoint */
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1445
		const DrawTileSprites* dts;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1446
		const DrawTileSeqStruct* dtss;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1447
		uint32 relocation;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1448
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1449
		if (ti->tileh != SLOPE_FLAT) DrawFoundation(ti, ti->tileh);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1450
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  1451
		if (IsRailDepot(ti->tile)) {
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1452
			dts = &_depot_gfx_table[GetRailDepotDirection(ti->tile)];
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1453
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1454
			relocation = rti->total_offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1455
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1456
			image = dts->ground_sprite;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1457
			if (image != SPR_FLAT_GRASS_TILE) image += rti->total_offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1458
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1459
			/* adjust ground tile for desert
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1460
			 * don't adjust for snow, because snow in depots looks weird */
6357
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6343
diff changeset
  1461
			if (IsSnowRailGround(ti->tile) && _opt.landscape == LT_TROPIC) {
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1462
				if (image != SPR_FLAT_GRASS_TILE) {
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1463
					image += rti->snow_offset; // tile with tracks
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1464
				} else {
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1465
					image = SPR_FLAT_SNOWY_TILE; // flat ground
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1466
				}
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1467
			}
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1468
		} else {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1469
			/* look for customization */
2670
f2d6a8424e3e (svn r3212) - Waypoints/Depots: Store waypoint index in m2 for waypoints. This moves the ground type bits from m2 to m4 for waypoints and depots (leaving room for depot index in m2 in future), and moves the custom graphics ID to the waypoint struct.
peter1138
parents: 2668
diff changeset
  1470
			byte stat_id = GetWaypointByTile(ti->tile)->stat_id;
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3671
diff changeset
  1471
			const StationSpec *statspec = GetCustomStationSpec(STAT_CLASS_WAYP, stat_id);
389
16ee9854091e (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 337
diff changeset
  1472
3676
680dfa6336a1 (svn r4593) CodeChange : Renamed spec (when using StationSpec) to statspec.
belugas
parents: 3671
diff changeset
  1473
			if (statspec != NULL) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1474
				/* emulate station tile - open with building */
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1475
				const Station* st = ComposeWaypointStation(ti->tile);
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1476
				uint gfx = 2;
3757
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
  1477
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
  1478
				if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
  1479
					uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1480
					if (callback != CALLBACK_FAILED) gfx = callback;
3757
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
  1481
				}
0c6a690e6b41 (svn r4748) - Newstations: use custom sprite layout callback for waypoints as well as stations. Supports merging of adjacent waypoints if the GRF supports it (newstatsw.grf)
peter1138
parents: 3751
diff changeset
  1482
3763
7098c393c172 (svn r4754) - Newstations: expose default station display data via a function so we can use it (rarely) in other places.
peter1138
parents: 3757
diff changeset
  1483
				if (statspec->renderdata == NULL) {
7272
d47fc9e22d1c (svn r10601) -Codechange: store (and use) the type of stations instead of hardcoding station types by graphics IDs.
rubidium
parents: 7163
diff changeset
  1484
					dts = GetStationTileLayout(STATION_RAIL, gfx);
3763
7098c393c172 (svn r4754) - Newstations: expose default station display data via a function so we can use it (rarely) in other places.
peter1138
parents: 3757
diff changeset
  1485
				} else {
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1486
					dts = &statspec->renderdata[(gfx < statspec->tiles ? gfx : 0) + GetWaypointAxis(ti->tile)];
3763
7098c393c172 (svn r4754) - Newstations: expose default station display data via a function so we can use it (rarely) in other places.
peter1138
parents: 3757
diff changeset
  1487
				}
447
7e4bb71b8752 (svn r657) Do not touch 0x8000 bit in sprite index for custom waypoints. (pasky)
celestar
parents: 438
diff changeset
  1488
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1489
				if (dts != NULL && dts->seq != NULL) {
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1490
					relocation = GetCustomStationRelocation(statspec, st, ti->tile);
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1491
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1492
					image = dts->ground_sprite;
5738
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1493
					if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
3775
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3763
diff changeset
  1494
						image += GetCustomStationGroundRelocation(statspec, st, ti->tile);
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3763
diff changeset
  1495
						image += rti->custom_ground_offset;
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3763
diff changeset
  1496
					} else {
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3763
diff changeset
  1497
						image += rti->total_offset;
0fb5118536c3 (svn r4767) - Newstations: fix loading / use of custom ground sprites
peter1138
parents: 3763
diff changeset
  1498
					}
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1499
				} else {
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1500
					goto default_waypoint;
389
16ee9854091e (svn r581) -newgrf: Basic support for new stations - only waypoints supported now and only
celestar
parents: 337
diff changeset
  1501
				}
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1502
			} else {
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1503
default_waypoint:
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1504
				/* There is no custom layout, fall back to the default graphics */
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1505
				dts = &_waypoint_gfx_table[GetWaypointAxis(ti->tile)];
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1506
				relocation = 0;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1507
				image = dts->ground_sprite + rti->total_offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1508
				if (IsSnowRailGround(ti->tile)) image += rti->snow_offset;
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1509
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1510
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1511
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1512
		DrawGroundSprite(image, PAL_NONE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1513
3355
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3333
diff changeset
  1514
		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
e414a0b104a6 (svn r4150) -Feature: Merged elrails into trunk. Thanks to Tron for lots of code and proofreading, thanks to peter1138 for another lot of code and ideas.
celestar
parents: 3333
diff changeset
  1515
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1516
		foreach_draw_tile_seq(dtss, dts->seq) {
5738
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1517
			SpriteID image = dtss->image;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1518
			SpriteID pal;
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1519
5738
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1520
			/* Unlike stations, our default waypoint has no variation for
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1521
			 * different railtype, so don't use the railtype offset if
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1522
			 * no relocation is set */
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1523
			if (HASBIT(image, SPRITE_MODIFIER_USE_OFFSET)) {
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1524
				image += rti->total_offset;
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1525
			} else {
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1526
				image += relocation;
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1527
			}
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1528
6427
7dc1012757d8 (svn r9563) -Feature: Add more finer control to transparency options, including a new toolbar, accessible from the map menu or Ctrl X. Patch by Wolf01.
peter1138
parents: 6420
diff changeset
  1529
			if (HASBIT(_transparent_opt, TO_BUILDINGS)) {
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1530
				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1531
				pal = PALETTE_TO_TRANSPARENT;
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1532
			} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1533
				pal = _drawtile_track_palette;
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1534
			} else {
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1535
				pal = dtss->pal;
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1536
			}
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1537
5738
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1538
			if ((byte)dtss->delta_z != 0x80) {
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1539
				AddSortableSpriteToDraw(
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1540
					image, pal,
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1541
					ti->x + dtss->delta_x, ti->y + dtss->delta_y,
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1542
					dtss->size_x, dtss->size_y,
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1543
					dtss->size_z, ti->z + dtss->delta_z
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1544
				);
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1545
			} else {
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1546
				AddChildSpriteScreen(image, pal, dtss->delta_x, dtss->delta_y);
5e2281cf6258 (svn r8283) -Fix (r8128): Custom waypoint drawing used wrong bits since bitshuffling occurred. Also update with other station drawing changes (code duplication,
peter1138
parents: 5735
diff changeset
  1547
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1548
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1549
	}
5385
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1550
	DrawBridgeMiddle(ti);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1551
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1552
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1553
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1554
static void DrawTileSequence(int x, int y, SpriteID ground, const DrawTileSeqStruct* dtss, uint32 offset)
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1555
{
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1556
	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1557
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1558
	DrawSprite(ground, PAL_NONE, x, y);
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1559
	for (; dtss->image != 0; dtss++) {
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1560
		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1561
		SpriteID image = dtss->image + offset;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1562
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1563
		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
  1564
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1565
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1566
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1567
void DrawTrainDepotSprite(int x, int y, int dir, RailType railtype)
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1568
{
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1569
	const DrawTileSprites* dts = &_depot_gfx_table[dir];
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5598
diff changeset
  1570
	SpriteID image = dts->ground_sprite;
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1571
	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1572
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1573
	if (image != SPR_FLAT_GRASS_TILE) image += offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1574
	DrawTileSequence(x + 33, y + 17, image, dts->seq, offset);
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1575
}
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1576
2520
8a52362c4ada (svn r3049) Replace byte/int/uint by RailType where appropriate
tron
parents: 2502
diff changeset
  1577
void DrawDefaultWaypointSprite(int x, int y, RailType railtype)
2261
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
  1578
{
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1579
	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1580
	const DrawTileSprites* dts = &_waypoint_gfx_table[AXIS_X];
2261
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
  1581
4225
88d760a6a4bf (svn r5771) Unify several code paths and data structures for drawing train depots and waypoints
tron
parents: 4182
diff changeset
  1582
	DrawTileSequence(x, y, dts->ground_sprite + offset, dts->seq, 0);
2261
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
  1583
}
d3554e5d3e86 (svn r2781) Fix some of the issues with variables in .h files.
ludde
parents: 2254
diff changeset
  1584
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6187
diff changeset
  1585
struct SetSignalsData {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1586
	int cur;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1587
	int cur_stack;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1588
	bool stop;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1589
	bool has_presignal;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1590
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1591
	/* presignal info */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1592
	int presignal_exits;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1593
	int presignal_exits_free;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1594
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1595
	/* these are used to keep track of the signals that change. */
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1596
	TrackdirByte bit[NUM_SSD_ENTRY];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1597
	TileIndex tile[NUM_SSD_ENTRY];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1598
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1599
	/* these are used to keep track of the stack that modifies presignals recursively */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1600
	TileIndex next_tile[NUM_SSD_STACK];
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1601
	DiagDirectionByte next_dir[NUM_SSD_STACK];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1602
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6187
diff changeset
  1603
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1604
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1605
static bool SetSignalsEnumProc(TileIndex tile, void* data, Trackdir trackdir, uint length, byte* state)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1606
{
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1607
	SetSignalsData* ssd = (SetSignalsData*)data;
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1608
	Track track = TrackdirToTrack(trackdir);
4479
37a0ca8812e0 (svn r6264) Get rid of a cast
tron
parents: 4466
diff changeset
  1609
3017
a75caf4efa2d (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
  1610
	if (!IsTileType(tile, MP_RAILWAY)) return false;
a75caf4efa2d (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
  1611
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1612
	/* the tile has signals? */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1613
	if (HasSignalOnTrack(tile, track)) {
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1614
		if (HasSignalOnTrackdir(tile, ReverseTrackdir(trackdir))) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1615
			/* yes, add the signal to the list of signals */
3017
a75caf4efa2d (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
  1616
			if (ssd->cur != NUM_SSD_ENTRY) {
a75caf4efa2d (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
  1617
				ssd->tile[ssd->cur] = tile; // remember the tile index
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1618
				ssd->bit[ssd->cur] = trackdir; // and the controlling bit number
3017
a75caf4efa2d (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
  1619
				ssd->cur++;
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
  1620
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1621
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1622
			/* remember if this block has a presignal. */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1623
			ssd->has_presignal |= IsPresignalEntry(tile, track);
3017
a75caf4efa2d (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
  1624
		}
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
  1625
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1626
		if (HasSignalOnTrackdir(tile, trackdir) && IsPresignalExit(tile, track)) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1627
			/* this is an exit signal that points out from the segment */
3017
a75caf4efa2d (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
  1628
			ssd->presignal_exits++;
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1629
			if (GetSignalStateByTrackdir(tile, trackdir) != SIGNAL_STATE_RED)
3017
a75caf4efa2d (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
  1630
				ssd->presignal_exits_free++;
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1631
		}
3017
a75caf4efa2d (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
  1632
a75caf4efa2d (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
  1633
		return true;
a75caf4efa2d (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
  1634
	} else if (IsTileDepotType(tile, TRANSPORT_RAIL)) {
a75caf4efa2d (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
  1635
		return true; // don't look further if the tile is a depot
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1636
	}
3017
a75caf4efa2d (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
  1637
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1638
	return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1639
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1640
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1641
/* Struct to parse data from VehicleFromPos to SignalVehicleCheckProc */
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6187
diff changeset
  1642
struct SignalVehicleCheckStruct {
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1643
	TileIndex tile;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1644
	uint track;
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6187
diff changeset
  1645
};
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1646
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1647
static void *SignalVehicleCheckProc(Vehicle *v, void *data)
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1648
{
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1649
	const SignalVehicleCheckStruct* dest = (SignalVehicleCheckStruct*)data;
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1650
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  1651
	if (v->type != VEH_TRAIN) return NULL;
1609
108c0501019e (svn r2113) -Fix: first check if a vehicle is a train, before accessing u.rail
truelight
parents: 1598
diff changeset
  1652
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1653
	/* Wrong tile, or no train? Not a match */
5385
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1654
	if (v->tile != dest->tile) return NULL;
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1655
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1656
	/* Are we on the same piece of track? */
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4067
diff changeset
  1657
	if (dest->track & v->u.rail.track * 0x101) return v;
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1658
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1659
	return NULL;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1660
}
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1661
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1662
/* Special check for SetSignalsAfterProc, to see if there is a vehicle on this tile */
2752
55e04dee346d (svn r3297) Staticise
tron
parents: 2737
diff changeset
  1663
static bool SignalVehicleCheck(TileIndex tile, uint track)
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1664
{
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1665
	SignalVehicleCheckStruct dest;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1666
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1667
	dest.tile = tile;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1668
	dest.track = track;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1669
5385
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1670
	/* Locate vehicles in tunnels or on bridges */
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1671
	if (IsTunnelTile(tile) || IsBridgeTile(tile)) {
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1672
		TileIndex end;
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1673
		DiagDirection direction;
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1674
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1675
		if (IsTunnelTile(tile)) {
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1676
			end = GetOtherTunnelEnd(tile);
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1677
			direction = GetTunnelDirection(tile);
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1678
		} else {
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1679
			end = GetOtherBridgeEnd(tile);
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1680
			direction = GetBridgeRampDirection(tile);
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1681
		}
3154
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
  1682
1816
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1683
		dest.track = 1 << (direction & 1); // get the trackbit the vehicle would have if it has not entered the tunnel yet (ie is still visible)
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1684
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1685
		/* check for a vehicle with that trackdir on the start tile of the tunnel */
1818
56af6f0d6123 (svn r2322) - CodeChange: doxygen commented the tunnel-crash fix. Also if (bla) {return;} else {return;} is not proper code. It's if (bla) {return;} return; ;)
Darkvater
parents: 1816
diff changeset
  1686
		if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) return true;
1816
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1687
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1688
		/* check for a vehicle with that trackdir on the end tile of the tunnel */
3154
6ab0cb6b7ab3 (svn r3777) Add some functions to handle tunnels
tron
parents: 3153
diff changeset
  1689
		if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true;
1816
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1690
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1691
		/* now check all tiles from start to end for a warping vehicle
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1692
		 * NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile? */
5385
3868f2e6db9b (svn r7573) -Merged the bridge branch. Allows to build bridges of arbitrary rail/road combinations (including signals)
celestar
parents: 5380
diff changeset
  1693
		dest.track = 0x40;   //Vehicle inside a tunnel or on a bridge
4559
aa0c13e39840 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4556
diff changeset
  1694
		for (; tile != end; tile += TileOffsByDiagDir(direction)) {
1816
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1695
			if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1696
				return true;
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1697
		}
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1698
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1699
		/* no vehicle found */
1816
732d82acc97e (svn r2320) - Fix: [ 1185176 ] Train in tunnel is not properly detected by signal code (Hackykid)
matthijs
parents: 1813
diff changeset
  1700
		return false;
1818
56af6f0d6123 (svn r2322) - CodeChange: doxygen commented the tunnel-crash fix. Also if (bla) {return;} else {return;} is not proper code. It's if (bla) {return;} return; ;)
Darkvater
parents: 1816
diff changeset
  1701
	}
56af6f0d6123 (svn r2322) - CodeChange: doxygen commented the tunnel-crash fix. Also if (bla) {return;} else {return;} is not proper code. It's if (bla) {return;} return; ;)
Darkvater
parents: 1816
diff changeset
  1702
56af6f0d6123 (svn r2322) - CodeChange: doxygen commented the tunnel-crash fix. Also if (bla) {return;} else {return;} is not proper code. It's if (bla) {return;} return; ;)
Darkvater
parents: 1816
diff changeset
  1703
	return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1704
}
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1705
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1706
static void SetSignalsAfterProc(TrackPathFinder *tpf)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1707
{
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1708
	SetSignalsData *ssd = (SetSignalsData*)tpf->userdata;
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
  1709
	const TrackPathFinderLink* link;
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1710
	uint offs;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1711
	uint i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1712
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1713
	ssd->stop = false;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1714
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1715
	/* Go through all the PF tiles */
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1716
	for (i = 0; i < lengthof(tpf->hash_head); i++) {
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1717
		/* Empty hash item */
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
  1718
		if (tpf->hash_head[i] == 0) continue;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1719
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1720
		/* If 0x8000 is not set, there is only 1 item */
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1721
		if (!(tpf->hash_head[i] & 0x8000)) {
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1722
			/* Check if there is a vehicle on this tile */
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1723
			if (SignalVehicleCheck(tpf->hash_tile[i], tpf->hash_head[i])) {
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1724
				ssd->stop = true;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1725
				return;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1726
			}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1727
		} else {
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1728
			/* There are multiple items, where hash_tile points to the first item in the list */
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1729
			offs = tpf->hash_tile[i];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1730
			do {
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1731
				/* Find the next item */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1732
				link = PATHFIND_GET_LINK_PTR(tpf, offs);
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1733
				/* Check if there is a vehicle on this tile */
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1734
				if (SignalVehicleCheck(link->tile, link->flags)) {
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1735
					ssd->stop = true;
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1736
					return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1737
				}
1555
7259e8f70267 (svn r2059) -Codechange: rewrote SetSignalsAfterProc so now the tiles from the PF
truelight
parents: 1542
diff changeset
  1738
				/* Goto the next item */
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1739
			} while ((offs = link->next) != 0xFFFF);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1740
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1741
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1742
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1743
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1744
static void ChangeSignalStates(SetSignalsData *ssd)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1745
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1746
	int i;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1747
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1748
	/* thinking about presignals...
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1749
	 * the presignal is green if,
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1750
	 *   if no train is in the segment AND
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1751
	 *   there is at least one green exit signal OR
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1752
	 *   there are no exit signals in the segment */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1753
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1754
	/* then mark the signals in the segment accordingly */
2549
5587f9a38563 (svn r3078) Some more stuff, which piled up:
tron
parents: 2548
diff changeset
  1755
	for (i = 0; i != ssd->cur; i++) {
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  1756
		TileIndex tile = ssd->tile[i];
2821
cb5abbcc0f0c (svn r3369) - Codechange: Replace tables _signals_table, _signals_table_other and _signals_table_both by the equivalent calls to rail.h functions.
matthijs
parents: 2817
diff changeset
  1757
		byte bit = SignalAgainstTrackdir(ssd->bit[i]);
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  1758
		uint signals = GetSignalStates(tile);
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1759
		Track track = TrackdirToTrack(ssd->bit[i]);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1760
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1761
		/* presignals don't turn green if there is at least one presignal exit and none are free */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1762
		if (IsPresignalEntry(tile, track)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1763
			int ex = ssd->presignal_exits, exfree = ssd->presignal_exits_free;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1764
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1765
			/* subtract for dual combo signals so they don't count themselves */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1766
			if (IsPresignalExit(tile, track) && HasSignalOnTrackdir(tile, ssd->bit[i])) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1767
				ex--;
3520
a288391e66a3 (svn r4376) -Codechange Renamed GetSignalState to GetSignalStateByTrackdir
celestar
parents: 3519
diff changeset
  1768
				if (GetSignalStateByTrackdir(tile, ssd->bit[i]) != SIGNAL_STATE_RED) exfree--;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1769
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1770
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1771
			/* if we have exits and none are free, make red. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1772
			if (ex && !exfree) goto make_red;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1773
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1774
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1775
		/* check if the signal is unaffected. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1776
		if (ssd->stop) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1777
make_red:
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1778
			/* turn red */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  1779
			if ((bit & signals) == 0) continue;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1780
		} else {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1781
			/* turn green */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  1782
			if ((bit & signals) != 0) continue;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1783
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1784
1813
f41543d443b0 (svn r2317) - Fix: [ 1193048 ] Pre-signal stays red when there is only a single exit signal (dinno)
Darkvater
parents: 1796
diff changeset
  1785
		/* Update signals on the other side of this exit-combo signal; it changed. */
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  1786
		if (IsPresignalExit(tile, track)) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1787
			if (ssd->cur_stack != NUM_SSD_STACK) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1788
				ssd->next_tile[ssd->cur_stack] = tile;
7158
ca0084d96dbd (svn r10432) -Codechange: use existing function instead of data duplication
peter1138
parents: 7043
diff changeset
  1789
				ssd->next_dir[ssd->cur_stack] = TrackdirToExitdir(ssd->bit[i]);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1790
				ssd->cur_stack++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1791
			} else {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5198
diff changeset
  1792
				DEBUG(misc, 0, "NUM_SSD_STACK too small"); /// @todo WTF is this???
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1793
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1794
		}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1795
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1796
		/* it changed, so toggle it */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  1797
		SetSignalStates(tile, signals ^ bit);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1798
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1799
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1800
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1801
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1802
3172
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1803
bool UpdateSignalsOnSegment(TileIndex tile, DiagDirection direction)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1804
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1805
	SetSignalsData ssd;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1806
	int result = -1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1807
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1808
	ssd.cur_stack = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1809
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1810
	for (;;) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1811
		/* go through one segment and update all signals pointing into that segment. */
2916
b687477adcba (svn r3472) - [PBS] Remove from trunk. Anyone interested can still find it in branch/pbs. This reverts revisions r3158, r3140, r3075, r2977, r2674, r2625, r2621, r2529, r2528, r2525, r2524, r2519, r2517, r2516, r2507, r2499. (in conjunction with Tron)
Darkvater
parents: 2911
diff changeset
  1812
		ssd.cur = ssd.presignal_exits = ssd.presignal_exits_free = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1813
		ssd.has_presignal = false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1814
6683
b88ae30866ce (svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents: 6661
diff changeset
  1815
		FollowTrack(tile, 0xC000 | TRANSPORT_RAIL, 0, direction, SetSignalsEnumProc, SetSignalsAfterProc, &ssd);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1816
		ChangeSignalStates(&ssd);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1817
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1818
		/* remember the result only for the first iteration. */
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1819
		if (result < 0) {
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1820
			/* stay in depot while segment is occupied or while all presignal exits are blocked */
3900
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1821
			result = ssd.stop || (ssd.presignal_exits > 0 && ssd.presignal_exits_free == 0);
2c84ed52709d (svn r4987) Feature: Merged YAPF into trunk. Thanks to devs for continuous support and users for testing.
KUDr
parents: 3884
diff changeset
  1822
		}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1823
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1824
		/* if any exit signals were changed, we need to keep going to modify the stuff behind those. */
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
  1825
		if (ssd.cur_stack == 0) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1826
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1827
		/* one or more exit signals were changed, so we need to update another segment too. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1828
		tile = ssd.next_tile[--ssd.cur_stack];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1829
		direction = ssd.next_dir[ssd.cur_stack];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1830
	}
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  1831
3017
a75caf4efa2d (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
  1832
	return result != 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1833
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1834
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  1835
void SetSignalsOnBothDir(TileIndex tile, byte track)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1836
{
3172
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1837
	static const DiagDirection _search_dir_1[] = {
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1838
		DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_NE, DIAGDIR_SE, DIAGDIR_SW, DIAGDIR_SE
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1839
	};
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1840
	static const DiagDirection _search_dir_2[] = {
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1841
		DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NW, DIAGDIR_SW, DIAGDIR_NW, DIAGDIR_NE
ade284ef48ed (svn r3803) Change the second parameter of UpdateSignalsOnSegment() from Direction to DiagDirection as that's what it really operates on
tron
parents: 3157
diff changeset
  1842
	};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1843
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1844
	UpdateSignalsOnSegment(tile, _search_dir_1[track]);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1845
	UpdateSignalsOnSegment(tile, _search_dir_2[track]);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1846
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1847
4231
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1848
static uint GetSlopeZ_Track(TileIndex tile, uint x, uint y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1849
{
4231
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1850
	uint z;
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1851
	Slope tileh = GetTileSlope(tile, &z);
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  1852
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1853
	if (tileh == SLOPE_FLAT) return z;
4231
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1854
	if (IsPlainRailTile(tile)) {
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1855
		uint f = GetRailFoundation(tileh, GetTrackBits(tile));
3286
5177aab0ec21 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3284
diff changeset
  1856
5177aab0ec21 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3284
diff changeset
  1857
		if (f != 0) {
4246
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
  1858
			if (IsSteepSlope(tileh)) {
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
  1859
				z += TILE_HEIGHT;
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
  1860
			} else if (f < 15) {
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
  1861
				return z + TILE_HEIGHT; // leveled foundation
6dcc0e44a367 (svn r5833) -Feature: Allow building of (certain) rails, roads and bridge ramps on steep sloped tiles
tron
parents: 4231
diff changeset
  1862
			}
3286
5177aab0ec21 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3284
diff changeset
  1863
			tileh = _inclined_tileh[f - 15]; // inclined foundation
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1864
		}
4231
2823b3643862 (svn r5794) Pass the TileIndex plus x and y coordinates into GetSlopeZ_* instead of a TileInfo
tron
parents: 4230
diff changeset
  1865
		return z + GetPartialZ(x & 0xF, y & 0xF, tileh);
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1866
	} else {
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1867
		return z + TILE_HEIGHT;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1868
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1869
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1870
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1871
static Slope GetSlopeTileh_Track(TileIndex tile, Slope tileh)
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1872
{
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1873
	if (tileh == SLOPE_FLAT) return SLOPE_FLAT;
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1874
	if (IsPlainRailTile(tile)) {
3418
ec9003ebf933 (svn r4242) Pass TileIndex and slope to GetSlopeTileh_*() instead of TileInfo
tron
parents: 3379
diff changeset
  1875
		uint f = GetRailFoundation(tileh, GetTrackBits(tile));
3286
5177aab0ec21 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3284
diff changeset
  1876
3418
ec9003ebf933 (svn r4242) Pass TileIndex and slope to GetSlopeTileh_*() instead of TileInfo
tron
parents: 3379
diff changeset
  1877
		if (f == 0) return tileh;
3636
a36cc46e754d (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3575
diff changeset
  1878
		if (f < 15) return SLOPE_FLAT; // leveled foundation
3286
5177aab0ec21 (svn r4000) Rewrite GetSlope{Tileh,Z}_{Road,Track} in a less confusing way
tron
parents: 3284
diff changeset
  1879
		return _inclined_tileh[f - 15]; // inclined foundation
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1880
	} else {
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1881
		return SLOPE_FLAT;
39
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1882
	}
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1883
}
d177340ed556 (svn r40) Final slope graphics fix
dominik
parents: 22
diff changeset
  1884
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  1885
static void GetAcceptedCargo_Track(TileIndex tile, AcceptedCargo ac)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1886
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1887
	/* not used */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1888
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1889
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  1890
static void AnimateTile_Track(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1891
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1892
	/* not used */
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1893
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1894
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  1895
static void TileLoop_Track(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1896
{
3523
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  1897
	RailGroundType old_ground = GetRailGroundType(tile);
4483
286633eb42fc (svn r6268) Remove now pointless assignment (followup of r6267)
tron
parents: 4482
diff changeset
  1898
	RailGroundType new_ground;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1899
2631
2ed0eb408229 (svn r3173) Use the trinary operator and switch to improve readability
tron
parents: 2626
diff changeset
  1900
	switch (_opt.landscape) {
6357
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6343
diff changeset
  1901
		case LT_ARCTIC:
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6259
diff changeset
  1902
			if (GetTileZ(tile) > GetSnowLine()) {
3562
83a833bbe9ac (svn r4440) - Fix: Yoyo-effect of rail in desert/snow introduced by r4379. When a special groundtype below the track is encountered in the tileloop, always return even if groundtype hasn't changed.
Darkvater
parents: 3549
diff changeset
  1903
				new_ground = RAIL_GROUND_ICE_DESERT;
4482
5010275cab9e (svn r6267) Simplify the control flow in the rail tile loop by eliminating a bool flag and replacing it by a simple goto
tron
parents: 4479
diff changeset
  1904
				goto set_ground;
3562
83a833bbe9ac (svn r4440) - Fix: Yoyo-effect of rail in desert/snow introduced by r4379. When a special groundtype below the track is encountered in the tileloop, always return even if groundtype hasn't changed.
Darkvater
parents: 3549
diff changeset
  1905
			}
2631
2ed0eb408229 (svn r3173) Use the trinary operator and switch to improve readability
tron
parents: 2626
diff changeset
  1906
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1907
6357
f0f5e7d1713c (svn r9400) -Codechange: Use some more representative enum names for landscape types.
belugas
parents: 6343
diff changeset
  1908
		case LT_TROPIC:
3562
83a833bbe9ac (svn r4440) - Fix: Yoyo-effect of rail in desert/snow introduced by r4379. When a special groundtype below the track is encountered in the tileloop, always return even if groundtype hasn't changed.
Darkvater
parents: 3549
diff changeset
  1909
			if (GetTropicZone(tile) == TROPICZONE_DESERT) {
83a833bbe9ac (svn r4440) - Fix: Yoyo-effect of rail in desert/snow introduced by r4379. When a special groundtype below the track is encountered in the tileloop, always return even if groundtype hasn't changed.
Darkvater
parents: 3549
diff changeset
  1910
				new_ground = RAIL_GROUND_ICE_DESERT;
4482
5010275cab9e (svn r6267) Simplify the control flow in the rail tile loop by eliminating a bool flag and replacing it by a simple goto
tron
parents: 4479
diff changeset
  1911
				goto set_ground;
3562
83a833bbe9ac (svn r4440) - Fix: Yoyo-effect of rail in desert/snow introduced by r4379. When a special groundtype below the track is encountered in the tileloop, always return even if groundtype hasn't changed.
Darkvater
parents: 3549
diff changeset
  1912
			}
3523
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  1913
			break;
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  1914
	}
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  1915
4182
48dba107ff43 (svn r5624) Use {IsPlainRailTile,IsRailDepot,IsRailWaypoint,HasSignals}() instead of GetRailTile{T,Subt}ype() - this is more concise and a bit more flexible if/when the rail tile encoding changes
tron
parents: 4180
diff changeset
  1916
	if (!IsPlainRailTile(tile)) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1917
3523
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  1918
	new_ground = RAIL_GROUND_GRASS;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1919
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  1920
	if (old_ground != RAIL_GROUND_BARREN) { // wait until bottom is green
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1921
		/* determine direction of fence */
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
  1922
		TrackBits rail = GetTrackBits(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1923
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1924
		switch (rail) {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1925
			case TRACK_BIT_UPPER: new_ground = RAIL_GROUND_FENCE_HORIZ1; break;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1926
			case TRACK_BIT_LOWER: new_ground = RAIL_GROUND_FENCE_HORIZ2; break;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1927
			case TRACK_BIT_LEFT:  new_ground = RAIL_GROUND_FENCE_VERT1;  break;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1928
			case TRACK_BIT_RIGHT: new_ground = RAIL_GROUND_FENCE_VERT2;  break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1929
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1930
			default: {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1931
				PlayerID owner = GetTileOwner(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1932
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1933
				if (rail == (TRACK_BIT_LOWER | TRACK_BIT_RIGHT) || (
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1934
							(rail & TRACK_BIT_3WAY_NW) == 0 &&
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1935
							(rail & TRACK_BIT_X)
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1936
						)) {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1937
					TileIndex n = tile + TileDiffXY(0, -1);
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1938
					TrackBits nrail = GetTrackBits(n);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1939
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1940
					if (!IsTileType(n, MP_RAILWAY) ||
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1941
							!IsTileOwner(n, owner) ||
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1942
							nrail == TRACK_BIT_UPPER ||
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1943
							nrail == TRACK_BIT_LEFT) {
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1944
						new_ground = RAIL_GROUND_FENCE_NW;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1945
					}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1946
				}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1947
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1948
				if (rail == (TRACK_BIT_UPPER | TRACK_BIT_LEFT) || (
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1949
							(rail & TRACK_BIT_3WAY_SE) == 0 &&
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1950
							(rail & TRACK_BIT_X)
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1951
						)) {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1952
					TileIndex n = tile + TileDiffXY(0, 1);
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1953
					TrackBits nrail = GetTrackBits(n);
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1954
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1955
					if (!IsTileType(n, MP_RAILWAY) ||
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1956
							!IsTileOwner(n, owner) ||
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1957
							nrail == TRACK_BIT_LOWER ||
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1958
							nrail == TRACK_BIT_RIGHT) {
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1959
						new_ground = (new_ground == RAIL_GROUND_FENCE_NW) ?
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1960
							RAIL_GROUND_FENCE_SENW : RAIL_GROUND_FENCE_SE;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1961
					}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1962
				}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1963
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1964
				if (rail == (TRACK_BIT_LOWER | TRACK_BIT_LEFT) || (
3258
1c079364726d (svn r3946) Add short hand names for common track combinations
tron
parents: 3254
diff changeset
  1965
							(rail & TRACK_BIT_3WAY_NE) == 0 &&
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1966
							(rail & TRACK_BIT_Y)
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1967
						)) {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1968
					TileIndex n = tile + TileDiffXY(-1, 0);
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1969
					TrackBits nrail = GetTrackBits(n);
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1970
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1971
					if (!IsTileType(n, MP_RAILWAY) ||
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1972
							!IsTileOwner(n, owner) ||
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1973
							nrail == TRACK_BIT_UPPER ||
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1974
							nrail == TRACK_BIT_RIGHT) {
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1975
						new_ground = RAIL_GROUND_FENCE_NE;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1976
					}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1977
				}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1978
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1979
				if (rail == (TRACK_BIT_UPPER | TRACK_BIT_RIGHT) || (
3265
a11459ae44a0 (svn r3976) Fix typo in r3946
tron
parents: 3258
diff changeset
  1980
							(rail & TRACK_BIT_3WAY_SW) == 0 &&
3102
f9ca4379db9d (svn r3697) Rename DIAG1/DIAG2 to X resp. Y as this conveys a bit better in which direction a pieces of rail goes
tron
parents: 3101
diff changeset
  1981
							(rail & TRACK_BIT_Y)
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1982
						)) {
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1983
					TileIndex n = tile + TileDiffXY(1, 0);
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1984
					TrackBits nrail = GetTrackBits(n);
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1985
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1986
					if (!IsTileType(n, MP_RAILWAY) ||
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1987
							!IsTileOwner(n, owner) ||
3524
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1988
							nrail == TRACK_BIT_LOWER ||
0a5fa1095ff4 (svn r4380) -Codechange: Make use of GetTrackBits where appropriate
celestar
parents: 3523
diff changeset
  1989
							nrail == TRACK_BIT_LEFT) {
2839
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1990
						new_ground = (new_ground == RAIL_GROUND_FENCE_NE) ?
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1991
							RAIL_GROUND_FENCE_NESW : RAIL_GROUND_FENCE_SW;
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1992
					}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1993
				}
a466d41923d8 (svn r3387) Restructure the code, which places fences along railroad tracks.
tron
parents: 2821
diff changeset
  1994
				break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1995
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1996
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1997
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1998
4482
5010275cab9e (svn r6267) Simplify the control flow in the rail tile loop by eliminating a bool flag and replacing it by a simple goto
tron
parents: 4479
diff changeset
  1999
set_ground:
2667
f3ffefc784c5 (svn r3209) In TileLoop_Track(), use names based on function rather than their place in the map array.
peter1138
parents: 2645
diff changeset
  2000
	if (old_ground != new_ground) {
3523
549603ffba5d (svn r4379) -Codechange: Add and make use of map accessor functions concerning rail ground types
celestar
parents: 3522
diff changeset
  2001
		SetRailGroundType(tile, new_ground);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2002
		MarkTileDirtyByTile(tile);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2003
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2004
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2005
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2006
6683
b88ae30866ce (svn r9914) -Codechange: prepare GTTS and the pathfinders to handle multiple road types on a single tile.
rubidium
parents: 6661
diff changeset
  2007
static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode, uint sub_mode)
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  2008
{
2639
eeaefdabfdfd (svn r3181) -Bracing
tron
parents: 2631
diff changeset
  2009
	if (mode != TRANSPORT_RAIL) return 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2010
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2011
	switch (GetRailTileType(tile)) {
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2012
		default: NOT_REACHED();
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2013
		case RAIL_TILE_NORMAL: {
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2014
			TrackBits rails = GetTrackBits(tile);
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2015
			uint32 ret = rails * 0x101;
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2016
			return (rails == TRACK_BIT_CROSS) ? ret | 0x40 : ret;
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2017
		}
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
  2018
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2019
		case RAIL_TILE_SIGNALS: {
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2020
			uint32 ret = GetTrackBits(tile) * 0x101;
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2021
			byte a = GetPresentSignals(tile);
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2022
			uint b = GetSignalStates(tile);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2023
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2024
			b &= a;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2025
22
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 13
diff changeset
  2026
			/* When signals are not present (in neither
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 13
diff changeset
  2027
			 * direction), we pretend them to be green. (So if
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 13
diff changeset
  2028
			 * signals are only one way, the other way will
fe6f35cc987b (svn r23) -Some omments on the code (blathijs)
darkvater
parents: 13
diff changeset
  2029
			 * implicitely become `red' */
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2030
			if ((a & 0xC) == 0) b |= 0xC;
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2031
			if ((a & 0x3) == 0) b |= 0x3;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2032
6753
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2033
			if ((b & 0x8) == 0) ret |= 0x10070000;
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2034
			if ((b & 0x4) == 0) ret |= 0x07100000;
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2035
			if ((b & 0x2) == 0) ret |= 0x20080000;
c1013c837417 (svn r9988) -Codechange: remove the last direct map accesses, except the ones needed for the savegame saving/loading mechanisms.
rubidium
parents: 6728
diff changeset
  2036
			if ((b & 0x1) == 0) ret |= 0x08200000;
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2037
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2038
			return ret;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2039
		}
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2040
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2041
		case RAIL_TILE_DEPOT:    return AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(tile))) * 0x101;
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2042
		case RAIL_TILE_WAYPOINT: return GetRailWaypointBits(tile) * 0x101;
3267
feff95208a9f (svn r3979) Move GetRailFoundation() to rail_map.h and use it and friends to get information about rail tiles
tron
parents: 3265
diff changeset
  2043
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2044
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2045
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  2046
static void ClickTile_Track(TileIndex tile)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2047
{
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2048
	switch (GetRailTileType(tile)) {
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  2049
		case RAIL_TILE_DEPOT:    ShowDepotWindow(tile, VEH_TRAIN);                  break;
6187
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2050
		case RAIL_TILE_WAYPOINT: ShowRenameWaypointWindow(GetWaypointByTile(tile)); break;
60fc283a1722 (svn r8966) -Codechange: replace some if-cascades by switches.
rubidium
parents: 6172
diff changeset
  2051
		default: break;
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2544
diff changeset
  2052
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2053
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2054
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2055
static void GetTileDesc_Track(TileIndex tile, TileDesc *td)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2056
{
1901
03bf9bf99319 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
  2057
	td->owner = GetTileOwner(tile);
1942
c5d5cf5b0263 (svn r2448) General cleanup of rail related code, more to follow.
matthijs
parents: 1928
diff changeset
  2058
	switch (GetRailTileType(tile)) {
3792
67c865c9315c (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: 3778
diff changeset
  2059
		case RAIL_TILE_NORMAL:
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2060
			td->str = STR_1021_RAILROAD_TRACK;
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2061
			break;
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2062
3792
67c865c9315c (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: 3778
diff changeset
  2063
		case RAIL_TILE_SIGNALS: {
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2064
			const StringID signal_type[4][4] = {
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2065
				{
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2066
					STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2067
					STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2068
					STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2069
					STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2070
				},
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2071
				{
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2072
					STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2073
					STR_RAILROAD_TRACK_WITH_PRESIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2074
					STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2075
					STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2076
				},
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2077
				{
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2078
					STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2079
					STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2080
					STR_RAILROAD_TRACK_WITH_EXITSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2081
					STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2082
				},
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2083
				{
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2084
					STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2085
					STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2086
					STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS,
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2087
					STR_RAILROAD_TRACK_WITH_COMBOSIGNALS
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2088
				}
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2089
			};
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2090
6770
408585d467f9 (svn r10006) -Fix (FS#362): allow different signal types on one tile
glx
parents: 6753
diff changeset
  2091
			td->str = signal_type[GetSignalType(tile, TRACK_UPPER)][GetSignalType(tile, TRACK_LOWER)];
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2092
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2093
		}
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2094
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2095
		case RAIL_TILE_DEPOT:
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2096
			td->str = STR_1023_RAILROAD_TRAIN_DEPOT;
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2097
			break;
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2098
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2099
		case RAIL_TILE_WAYPOINT:
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2100
		default:
6172
e6d7a5b3d63f (svn r8935) -Codechange: unification of track type between road and rail tiles, unification of ground type between normal rail tiles and depots/waypoints and removing the need for RailTileSubType.
rubidium
parents: 6160
diff changeset
  2101
			td->str = STR_LANDINFO_WAYPOINT;
1590
3351993cb1da (svn r2094) In GetTileDesc_Track(): uint -> TileIndex, use enums, if () cascade -> switch
tron
parents: 1555
diff changeset
  2102
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2103
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2104
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2105
2436
7d5df545bd5d (svn r2962) - const correctness for all Get* functions and most Draw* functions that don't change their pointer parameters
Darkvater
parents: 2425
diff changeset
  2106
static void ChangeTileOwner_Track(TileIndex tile, PlayerID old_player, PlayerID new_player)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2107
{
1901
03bf9bf99319 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
  2108
	if (!IsTileOwner(tile, old_player)) return;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  2109
4848
45f848b46222 (svn r6774) -Codechange: Rename the badly named OWNER_SPECTATOR to PLAYER_SPECTATOR and
Darkvater
parents: 4792
diff changeset
  2110
	if (new_player != PLAYER_SPECTATOR) {
1902
86b7fb11f938 (svn r2408) Introduce SetTileOwner() and use it
tron
parents: 1901
diff changeset
  2111
		SetTileOwner(tile, new_player);
4434
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
  2112
	} else {
3491
35d747bb5e82 (svn r4342) Change the first two parameters of commands - virtual pixel coordinates of the tile to operate on - to a TileIndex
tron
parents: 3486
diff changeset
  2113
		DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2114
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2115
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2116
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2117
static const byte _fractcoords_behind[4] = { 0x8F, 0x8, 0x80, 0xF8 };
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2118
static const byte _fractcoords_enter[4] = { 0x8A, 0x48, 0x84, 0xA8 };
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2119
static const signed char _deltacoord_leaveoffset[8] = {
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2120
	-1,  0,  1,  0, /* x */
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2121
	 0,  1,  0, -1  /* y */
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2122
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2123
1977
37bbebf94434 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1963
diff changeset
  2124
static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2125
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2126
	byte fract_coord;
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2127
	byte fract_coord_leave;
3157
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
  2128
	DiagDirection dir;
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2129
	int length;
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  2130
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6406
diff changeset
  2131
	/* this routine applies only to trains in depot tiles */
6259
471b91a4b1d8 (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 6248
diff changeset
  2132
	if (v->type != VEH_TRAIN || !IsTileDepotType(tile, TRANSPORT_RAIL)) return VETSB_CONTINUE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2133
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2134
	/* depot direction */
3185
a9d0cdff7b84 (svn r3831) Add and use GetRailDepotDirection()
tron
parents: 3184
diff changeset
  2135
	dir = GetRailDepotDirection(tile);
201
c40d343115f8 (svn r202) -Codechange: I missed some files with trailing spaces.. this should be
truelight
parents: 159
diff changeset
  2136
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2137
	/* calculate the point where the following wagon should be activated */
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2138
	/* this depends on the length of the current vehicle */
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2139
	length = v->u.rail.cached_veh_length;
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2140
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2141
	fract_coord_leave =
4434
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
  2142
		((_fractcoords_enter[dir] & 0x0F) + // x
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2143
			(length + 1) * _deltacoord_leaveoffset[dir]) +
4434
a08cb4b5c179 (svn r6204) -Cleanup: replace non-indentation with spaces; like '}<TAB>else {' -> '} else {', tabs between code and comment, etc.
rubidium
parents: 4388
diff changeset
  2144
		(((_fractcoords_enter[dir] >> 4) +  // y
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2145
			((length + 1) * _deltacoord_leaveoffset[dir+4])) << 4);
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2146
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2147
	fract_coord = (x & 0xF) + ((y & 0xF) << 4);
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2148
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2149
	if (_fractcoords_behind[dir] == fract_coord) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2150
		/* make sure a train is not entering the tile from behind */
5991
ec2eebfe86de (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 5738
diff changeset
  2151
		return VETSB_CANNOT_ENTER;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2152
	} else if (_fractcoords_enter[dir] == fract_coord) {
3157
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
  2153
		if (DiagDirToDir(ReverseDiagDir(dir)) == v->direction) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2154
			/* enter the depot */
5993
956d341d930e (svn r8701) -Codechange: replace magic numbers with enums for u.rail.track.
rubidium
parents: 5991
diff changeset
  2155
			v->u.rail.track = TRACK_BIT_DEPOT,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2156
			v->vehstatus |= VS_HIDDEN; /* hide it */
3157
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
  2157
			v->direction = ReverseDir(v->direction);
5198
7046e5b0b5bc (svn r7313) -Codechange: Calling invalidate data on a window will surely warrant a redraw, so call
Darkvater
parents: 5116
diff changeset
  2158
			if (v->next == NULL) VehicleEnterDepot(v);
7046e5b0b5bc (svn r7313) -Codechange: Calling invalidate data on a window will surely warrant a redraw, so call
Darkvater
parents: 5116
diff changeset
  2159
			v->tile = tile;
7046e5b0b5bc (svn r7313) -Codechange: Calling invalidate data on a window will surely warrant a redraw, so call
Darkvater
parents: 5116
diff changeset
  2160
4739
e626ef1b522e (svn r6651) -Coding feature: added the windowevent WE_INVALIDATE_DATA
bjarni
parents: 4725
diff changeset
  2161
			InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
5991
ec2eebfe86de (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 5738
diff changeset
  2162
			return VETSB_ENTERED_WORMHOLE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2163
		}
1922
bda6f85eefaa (svn r2428) - Feature: [newgrf] Implement shorter train vehicles (Therax), and the callback that goes with it.
hackykid
parents: 1903
diff changeset
  2164
	} else if (fract_coord_leave == fract_coord) {
3157
3f35e2d9c8e3 (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3154
diff changeset
  2165
		if (DiagDirToDir(dir) == v->direction) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2166
			/* leave the depot? */
2951
2de6d3a59743 (svn r3510) Fiddle with whitespace and parentheses
tron
parents: 2934
diff changeset
  2167
			if ((v = v->next) != NULL) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2168
				v->vehstatus &= ~VS_HIDDEN;
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2169
				v->u.rail.track = (DiagDirToAxis(dir) == AXIS_X ? TRACK_BIT_X : TRACK_BIT_Y);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2170
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2171
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2172
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2173
5991
ec2eebfe86de (svn r8698) -Codechange: enumify the returns of VehicleEnterTile
rubidium
parents: 5738
diff changeset
  2174
	return VETSB_CONTINUE;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2175
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2176
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2177
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  2178
extern const TileTypeProcs _tile_type_rail_procs = {
4344
7e123fec5b0b (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: 4253
diff changeset
  2179
	DrawTile_Track,           /* draw_tile_proc */
7e123fec5b0b (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: 4253
diff changeset
  2180
	GetSlopeZ_Track,          /* get_slope_z_proc */
7e123fec5b0b (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: 4253
diff changeset
  2181
	ClearTile_Track,          /* clear_tile_proc */
7e123fec5b0b (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: 4253
diff changeset
  2182
	GetAcceptedCargo_Track,   /* get_accepted_cargo_proc */
7e123fec5b0b (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: 4253
diff changeset
  2183
	GetTileDesc_Track,        /* get_tile_desc_proc */
7e123fec5b0b (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: 4253
diff changeset
  2184
	GetTileTrackStatus_Track, /* get_tile_track_status_proc */
7e123fec5b0b (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: 4253
diff changeset
  2185
	ClickTile_Track,          /* click_tile_proc */
7e123fec5b0b (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: 4253
diff changeset
  2186
	AnimateTile_Track,        /* animate_tile_proc */
7e123fec5b0b (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: 4253
diff changeset
  2187
	TileLoop_Track,           /* tile_loop_clear */
7e123fec5b0b (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: 4253
diff changeset
  2188
	ChangeTileOwner_Track,    /* change_tile_owner_clear */
7e123fec5b0b (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: 4253
diff changeset
  2189
	NULL,                     /* get_produced_cargo_proc */
7e123fec5b0b (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: 4253
diff changeset
  2190
	VehicleEnter_Track,       /* vehicle_enter_tile_proc */
7e123fec5b0b (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: 4253
diff changeset
  2191
	GetSlopeTileh_Track,      /* get_slope_tileh_proc */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  2192
};