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

This commit is contained in:
tron 2006-03-16 21:44:58 +00:00
parent 9aab1d5711
commit 2232412f59
3 changed files with 26 additions and 29 deletions

17
rail.h
View File

@ -61,9 +61,6 @@ typedef enum RailTypes {
INVALID_RAILTYPE = 0xFF,
} RailType;
enum {
SIG_SEMAPHORE_MASK = 1 << 2,
};
/** These are used to specify a single track. Can be translated to a trackbit
* with TrackToTrackbit */
@ -531,20 +528,6 @@ static inline SignalType GetSignalType(TileIndex tile, Track track)
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.

View File

@ -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)
{
TileIndex tile = TileVirtXY(x, y);
bool semaphore;
SignalVariant sigvar;
bool pre_signal;
Track track = (Track)(p1 & 0x7);
int32 cost;
// 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))
return CMD_ERROR;
@ -718,7 +719,7 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
// build new signals
cost = _price.build_signals;
} else {
if (p2 != 0 && semaphore != HasSemaphores(tile, track)) {
if (p2 != 0 && sigvar != GetSignalVariant(tile)) {
// convert signals <-> semaphores
cost = _price.build_signals + _price.remove_signals;
} 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].m2 |= 0xF0; // all signals are on
_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) {
@ -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 */
_m[tile].m3 &= ~SignalOnTrack(track);
_m[tile].m3 |= p2 & SignalOnTrack(track);
// convert between signal<->semaphores when dragging
if (semaphore) {
SETBIT(_m[tile].m4, 2);
} else {
CLRBIT(_m[tile].m4, 2);
}
SetSignalVariant(tile, sigvar);
}
MarkTileDirtyByTile(tile);
@ -836,7 +833,8 @@ static int32 CmdSignalTrackHelper(int x, int y, uint32 flags, uint32 p1, uint32
signals = _m[tile].m3 & SignalOnTrack(track);
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
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) {
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
CLRBIT(_m[tile].m4, 2); // remove any possible semaphores
SetSignalVariant(tile, SIG_ELECTRIC); // remove any possible semaphores
}
SetSignalsOnBothDir(tile, track);

View File

@ -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)
{
SetTileType(t, MP_RAILWAY);