(svn r3911) Add functions to retrieve/set the signal variant (electric/semaphore)

pull/155/head
tron 19 years ago
parent d0908375f4
commit 0e3699bd5c

@ -61,9 +61,6 @@ typedef enum RailTypes {
INVALID_RAILTYPE = 0xFF, INVALID_RAILTYPE = 0xFF,
} RailType; } RailType;
enum {
SIG_SEMAPHORE_MASK = 1 << 2,
};
/** These are used to specify a single track. Can be translated to a trackbit /** These are used to specify a single track. Can be translated to a trackbit
* with TrackToTrackbit */ * with TrackToTrackbit */
@ -531,20 +528,6 @@ static inline SignalType GetSignalType(TileIndex tile, Track track)
return (SignalType)(_m[tile].m4 & SIGTYPE_MASK); return (SignalType)(_m[tile].m4 & SIGTYPE_MASK);
} }
/**
* Checks if this tile contains semaphores (returns true) or normal signals
* (returns false) on the given track. Does not check if there are actually
* signals on the track, you should use HasSignalsOnTrack() for that.
*
* Note that currently, the track argument is not used, since
* semaphores/electric signals cannot be mixed. This function is trying to be
* future-compatible, though.
*/
static inline bool HasSemaphores(TileIndex tile, Track track)
{
assert(IsValidTrack(track));
return (_m[tile].m4 & SIG_SEMAPHORE_MASK) != 0;
}
/** /**
* Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile. * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile.

@ -681,13 +681,14 @@ int32 CmdBuildTrainDepot(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2) int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{ {
TileIndex tile = TileVirtXY(x, y); TileIndex tile = TileVirtXY(x, y);
bool semaphore; SignalVariant sigvar;
bool pre_signal; bool pre_signal;
Track track = (Track)(p1 & 0x7); Track track = (Track)(p1 & 0x7);
int32 cost; int32 cost;
// Same bit, used in different contexts // Same bit, used in different contexts
semaphore = pre_signal = HASBIT(p1, 3); sigvar = HASBIT(p1, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC;
pre_signal = HASBIT(p1, 3);
if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicle(tile)) if (!ValParamTrackOrientation(track) || !IsTileType(tile, MP_RAILWAY) || !EnsureNoVehicle(tile))
return CMD_ERROR; return CMD_ERROR;
@ -718,7 +719,7 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// build new signals // build new signals
cost = _price.build_signals; cost = _price.build_signals;
} else { } else {
if (p2 != 0 && semaphore != HasSemaphores(tile, track)) { if (p2 != 0 && sigvar != GetSignalVariant(tile)) {
// convert signals <-> semaphores // convert signals <-> semaphores
cost = _price.build_signals + _price.remove_signals; cost = _price.build_signals + _price.remove_signals;
} else { } else {
@ -733,7 +734,8 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_m[tile].m5 |= RAIL_TYPE_SIGNALS; // change into signals _m[tile].m5 |= RAIL_TYPE_SIGNALS; // change into signals
_m[tile].m2 |= 0xF0; // all signals are on _m[tile].m2 |= 0xF0; // all signals are on
_m[tile].m3 &= ~0xF0; // no signals built by default _m[tile].m3 &= ~0xF0; // no signals built by default
_m[tile].m4 = semaphore ? SIG_SEMAPHORE_MASK : 0; _m[tile].m4 = 0;
SetSignalVariant(tile, sigvar);
} }
if (p2 == 0) { if (p2 == 0) {
@ -773,12 +775,7 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
* direction of the first signal given as parameter by CmdBuildManySignals */ * direction of the first signal given as parameter by CmdBuildManySignals */
_m[tile].m3 &= ~SignalOnTrack(track); _m[tile].m3 &= ~SignalOnTrack(track);
_m[tile].m3 |= p2 & SignalOnTrack(track); _m[tile].m3 |= p2 & SignalOnTrack(track);
// convert between signal<->semaphores when dragging SetSignalVariant(tile, sigvar);
if (semaphore) {
SETBIT(_m[tile].m4, 2);
} else {
CLRBIT(_m[tile].m4, 2);
}
} }
MarkTileDirtyByTile(tile); MarkTileDirtyByTile(tile);
@ -836,7 +833,8 @@ static int32 CmdSignalTrackHelper(int x, int y, uint32 flags, uint32 p1, uint32
signals = _m[tile].m3 & SignalOnTrack(track); signals = _m[tile].m3 & SignalOnTrack(track);
if (signals == 0) signals = SignalOnTrack(track); /* Can this actually occur? */ if (signals == 0) signals = SignalOnTrack(track); /* Can this actually occur? */
semaphores = (HasSemaphores(tile, track) ? 8 : 0); // copy signal/semaphores style (independent of CTRL) // copy signal/semaphores style (independent of CTRL)
semaphores = (GetSignalVariant(tile) == SIG_ELECTRIC ? 0 : 8);
} else // no signals exist, drag a two-way signal stretch } else // no signals exist, drag a two-way signal stretch
signals = SignalOnTrack(track); signals = SignalOnTrack(track);
@ -914,7 +912,7 @@ int32 CmdRemoveSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if (GB(_m[tile].m3, 4, 4) == 0) { if (GB(_m[tile].m3, 4, 4) == 0) {
SB(_m[tile].m2, 4, 4, 0); SB(_m[tile].m2, 4, 4, 0);
SB(_m[tile].m5, 6, 2, RAIL_TYPE_NORMAL >> 6); // XXX >> because the constant is meant for direct application, not use with SB SB(_m[tile].m5, 6, 2, RAIL_TYPE_NORMAL >> 6); // XXX >> because the constant is meant for direct application, not use with SB
CLRBIT(_m[tile].m4, 2); // remove any possible semaphores SetSignalVariant(tile, SIG_ELECTRIC); // remove any possible semaphores
} }
SetSignalsOnBothDir(tile, track); SetSignalsOnBothDir(tile, track);

@ -20,6 +20,22 @@ static inline TrackBits GetRailWaypointBits(TileIndex t)
} }
typedef enum SignalVariant {
SIG_ELECTRIC = 0,
SIG_SEMAPHORE = 1
} SignalVariant;
static inline SignalVariant GetSignalVariant(TileIndex t)
{
return (SignalVariant)GB(_m[t].m4, 2, 1);
}
static inline void SetSignalVariant(TileIndex t, SignalVariant v)
{
SB(_m[t].m4, 2, 1, v);
}
static inline void MakeRailNormal(TileIndex t, Owner o, TrackBits b, RailType r) static inline void MakeRailNormal(TileIndex t, Owner o, TrackBits b, RailType r)
{ {
SetTileType(t, MP_RAILWAY); SetTileType(t, MP_RAILWAY);

Loading…
Cancel
Save