summaryrefslogtreecommitdiff
path: root/src/rail_cmd.cpp
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2007-01-19 17:44:11 +0000
committerDarkvater <Darkvater@openttd.org>2007-01-19 17:44:11 +0000
commit7201689a170377cb60386ed64bbe6dd5b25c9f18 (patch)
tree2f1dff8f8cd3dbdfa8e83b41963a599eed5df24a /src/rail_cmd.cpp
parenta2eda30afa72542d702917655e6548b58d55ccba (diff)
downloadopenttd-7201689a170377cb60386ed64bbe6dd5b25c9f18.tar.xz
(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
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r--src/rail_cmd.cpp39
1 files changed, 19 insertions, 20 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp
index 242145607..a5643a48f 100644
--- a/src/rail_cmd.cpp
+++ b/src/rail_cmd.cpp
@@ -605,17 +605,17 @@ int32 CmdBuildTrainDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
* have any signals, bit 4 (cycle signal-type) is ignored
* @param tile tile where to build the signals
* @param p1 various bitstuffed elements
- * - p1 = (bit 0) - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
- * - p1 = (bit 1) - 0 = signals, 1 = semaphores
- * - p1 = (bit 2-4) - track-orientation, valid values: 0-5 (Track enum)
+ * - p1 = (bit 0-2) - track-orientation, valid values: 0-5 (Track enum)
+ * - p1 = (bit 3) - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p1 = (bit 4) - 0 = signals, 1 = semaphores
* @param p2 used for CmdBuildManySignals() to copy direction of first signal
* TODO: p2 should be replaced by two bits for "along" and "against" the track.
*/
int32 CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
- bool pre_signal = HASBIT(p1, 0);
- SignalVariant sigvar = HASBIT(p1, 1) ? SIG_SEMAPHORE : SIG_ELECTRIC;
- Track track = (Track)GB(p1, 2, 3);
+ Track track = (Track)GB(p1, 0, 3);
+ bool pre_signal = HASBIT(p1, 3);
+ SignalVariant sigvar = (pre_signal ^ HASBIT(p1, 4)) ? SIG_SEMAPHORE : SIG_ELECTRIC;
int32 cost;
if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicle(tile))
@@ -700,9 +700,9 @@ int32 CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
* @param tile start tile of drag
* @param p1 end tile of drag
* @param p2 various bitstuffed elements
- * - p2 = (bit 0) - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
- * - p2 = (bit 1) - 0 = signals, 1 = semaphores
- * - p2 = (bit 2- 4) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit 0- 2) - track-orientation, valid values: 0-5 (Track enum)
+ * - p2 = (bit 3) - 1 = override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p2 = (bit 4) - 0 = signals, 1 = semaphores
* - p2 = (bit 5) - 0 = build, 1 = remove signals
* - p2 = (bit 24-31) - user defined signals_density
*/
@@ -713,9 +713,9 @@ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint3
bool error = true;
TileIndex end_tile;
- bool mode = HASBIT(p2, 0);
- bool semaphores = HASBIT(p2, 1);
- Track track = (Track)GB(p2, 2, 3);
+ Track track = (Track)GB(p2, 0, 3);
+ bool mode = HASBIT(p2, 3);
+ bool semaphores = HASBIT(p2, 4);
bool remove = HASBIT(p2, 5);
Trackdir trackdir = TrackToTrackdir(track);
byte signal_density = GB(p2, 24, 8);
@@ -759,10 +759,9 @@ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint3
for (;;) {
// only build/remove signals with the specified density
if (signal_ctr % signal_density == 0) {
- int p1 = 0;
- SB(p1, 0, 1, mode);
- SB(p1, 1, 1, semaphores);
- SB(p1, 2, 3, TrackdirToTrack(trackdir));
+ uint32 p1 = GB(TrackdirToTrack(trackdir), 0, 3);
+ SB(p1, 3, 1, mode);
+ SB(p1, 4, 1, semaphores);
ret = DoCommand(tile, p1, signals, flags, remove ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS);
/* Be user-friendly and try placing signals as much as possible */
@@ -796,13 +795,13 @@ int32 CmdBuildSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
/** Remove signals
* @param tile coordinates where signal is being deleted from
* @param various bitstuffed elements, only track information is used
- * - p1 = (bit 0) - override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
- * - p1 = (bit 1) - 0 = signals, 1 = semaphores
- * - p1 = (bit 2- 4) - track-orientation, valid values: 0-5 (Track enum)
+ * - p1 = (bit 0- 2) - track-orientation, valid values: 0-5 (Track enum)
+ * - p1 = (bit 3) - override signal/semaphore, or pre/exit/combo signal (CTRL-toggle)
+ * - p1 = (bit 4) - 0 = signals, 1 = semaphores
*/
int32 CmdRemoveSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
- Track track = (Track)GB(p1, 2, 3);
+ Track track = (Track)GB(p1, 0, 3);
if (!ValParamTrackOrientation(track) ||
!IsTileType(tile, MP_RAILWAY) ||