From 2232412f598d0c046dff9168467efcdee7dcbbf2 Mon Sep 17 00:00:00 2001 From: tron Date: Thu, 16 Mar 2006 21:44:58 +0000 Subject: [PATCH] (svn r3911) Add functions to retrieve/set the signal variant (electric/semaphore) --- rail.h | 17 ----------------- rail_cmd.c | 22 ++++++++++------------ rail_map.h | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/rail.h b/rail.h index 8bda904413..8c7cb8a42c 100644 --- a/rail.h +++ b/rail.h @@ -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. diff --git a/rail_cmd.c b/rail_cmd.c index 51bbfb295f..a9913c7ceb 100644 --- a/rail_cmd.c +++ b/rail_cmd.c @@ -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); diff --git a/rail_map.h b/rail_map.h index ee407a3847..0ad2241317 100644 --- a/rail_map.h +++ b/rail_map.h @@ -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);