forked from mirror/OpenTTD
(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.
This commit is contained in:
@@ -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);
|
||||
|
Reference in New Issue
Block a user