diff options
author | Darkvater <darkvater@openttd.org> | 2007-01-19 00:01:52 +0000 |
---|---|---|
committer | Darkvater <darkvater@openttd.org> | 2007-01-19 00:01:52 +0000 |
commit | 110c0162df3a40865d1ec77fd93ae199d3c699cd (patch) | |
tree | a9079ae969407ae74140721c5c9fc7f5f5bdbd9d /src/rail_cmd.cpp | |
parent | 314e35beffc2d41ec09ada6cd3369c56f9db9258 (diff) | |
download | openttd-110c0162df3a40865d1ec77fd93ae199d3c699cd.tar.xz |
(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.
Diffstat (limited to 'src/rail_cmd.cpp')
-rw-r--r-- | src/rail_cmd.cpp | 53 |
1 files changed, 30 insertions, 23 deletions
diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index ccc51dca2..242145607 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -601,25 +601,23 @@ int32 CmdBuildTrainDepot(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) } /** Build signals, alternate between double/single, signal/semaphore, - * pre/exit/combo-signals, and what-else not + * pre/exit/combo-signals, and what-else not. If the rail piece does not + * 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-2) - track-orientation, valid values: 0-5 (Track enum) - * - p1 = (bit 3) - choose semaphores/signals or cycle normal/pre/exit/combo depending on context + * - 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) * @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) { - SignalVariant sigvar; - bool pre_signal; - Track track = (Track)(p1 & 0x7); + bool pre_signal = HASBIT(p1, 0); + SignalVariant sigvar = HASBIT(p1, 1) ? SIG_SEMAPHORE : SIG_ELECTRIC; + Track track = (Track)GB(p1, 2, 3); int32 cost; - // Same bit, used in different contexts - sigvar = HASBIT(p1, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC; - pre_signal = HASBIT(p1, 3); - if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicle(tile)) return CMD_ERROR; @@ -702,9 +700,10 @@ 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) - 0 = build, 1 = remove signals - * - p2 = (bit 3) - 0 = signals, 1 = semaphores - * - p2 = (bit 4- 6) - track-orientation, valid values: 0-5 (Track enum) + * - 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 5) - 0 = build, 1 = remove signals * - p2 = (bit 24-31) - user defined signals_density */ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) @@ -714,11 +713,12 @@ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint3 bool error = true; TileIndex end_tile; - int mode = p2 & 0x1; - Track track = (Track)GB(p2, 4, 3); + bool mode = HASBIT(p2, 0); + bool semaphores = HASBIT(p2, 1); + Track track = (Track)GB(p2, 2, 3); + bool remove = HASBIT(p2, 5); Trackdir trackdir = TrackToTrackdir(track); - byte semaphores = (HASBIT(p2, 3) ? 8 : 0); - byte signal_density = (p2 >> 24); + byte signal_density = GB(p2, 24, 8); if (p1 >= MapSize()) return CMD_ERROR; end_tile = p1; @@ -742,7 +742,7 @@ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint3 if (signals == 0) signals = SignalOnTrack(track); /* Can this actually occur? */ // copy signal/semaphores style (independent of CTRL) - semaphores = (GetSignalVariant(tile) == SIG_ELECTRIC ? 0 : 8); + semaphores = GetSignalVariant(tile) != SIG_ELECTRIC; } else { // no signals exist, drag a two-way signal stretch signals = SignalOnTrack(track); } @@ -754,12 +754,16 @@ static int32 CmdSignalTrackHelper(TileIndex tile, uint32 flags, uint32 p1, uint3 * semaphores - semaphores or signals * signals - is there a signal/semaphore on the first tile, copy its style (two-way/single-way) * and convert all others to semaphore/signal - * mode - 1 remove signals, 0 build signals */ + * remove - 1 remove signals, 0 build signals */ signal_ctr = total_cost = 0; for (;;) { // only build/remove signals with the specified density if (signal_ctr % signal_density == 0) { - ret = DoCommand(tile, TrackdirToTrack(trackdir) | semaphores, signals, flags, (mode == 1) ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS); + int p1 = 0; + SB(p1, 0, 1, mode); + SB(p1, 1, 1, semaphores); + SB(p1, 2, 3, TrackdirToTrack(trackdir)); + ret = DoCommand(tile, p1, signals, flags, remove ? CMD_REMOVE_SIGNALS : CMD_BUILD_SIGNALS); /* Be user-friendly and try placing signals as much as possible */ if (!CmdFailed(ret)) { @@ -791,11 +795,14 @@ int32 CmdBuildSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) /** Remove signals * @param tile coordinates where signal is being deleted from - * @param p1 track to remove signal from (Track enum) + * @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) */ int32 CmdRemoveSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - Track track = (Track)(p1 & 0x7); + Track track = (Track)GB(p1, 2, 3); if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || @@ -835,7 +842,7 @@ int32 CmdRemoveSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) */ int32 CmdRemoveSignalTrack(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) { - return CmdSignalTrackHelper(tile, flags, p1, SETBIT(p2, 0)); + return CmdSignalTrackHelper(tile, flags, p1, SETBIT(p2, 5)); // bit 5 is remove bit } typedef int32 DoConvertRailProc(TileIndex tile, RailType totype, bool exec); |