(svn r3911) Add functions to retrieve/set the signal variant (electric/semaphore)
authortron
Thu, 16 Mar 2006 21:44:58 +0000
changeset 3237 2cf19f9603b2
parent 3236 004a4e2bf30c
child 3238 9ebec0a611ee
(svn r3911) Add functions to retrieve/set the signal variant (electric/semaphore)
rail.h
rail_cmd.c
rail_map.h
--- a/rail.h	Thu Mar 16 16:47:39 2006 +0000
+++ b/rail.h	Thu Mar 16 21:44:58 2006 +0000
@@ -61,9 +61,6 @@
 	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 @@
 	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.
--- a/rail_cmd.c	Thu Mar 16 16:47:39 2006 +0000
+++ b/rail_cmd.c	Thu Mar 16 21:44:58 2006 +0000
@@ -681,13 +681,14 @@
 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 @@
 		// 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 @@
 			_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 @@
 			 * 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 @@
 		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 @@
 		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);
--- a/rail_map.h	Thu Mar 16 16:47:39 2006 +0000
+++ b/rail_map.h	Thu Mar 16 21:44:58 2006 +0000
@@ -20,6 +20,22 @@
 }
 
 
+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);