(svn r4378) -Add and make use of an accessor function two-way => one-way => one-way => two-way signal cycling
authorcelestar
Wed, 12 Apr 2006 09:36:27 +0000
changeset 3522 25ce619b9a19
parent 3521 c5dda2dbd977
child 3523 168ee460418b
(svn r4378) -Add and make use of an accessor function two-way => one-way => one-way => two-way signal cycling
rail_cmd.c
rail_map.h
--- a/rail_cmd.c	Wed Apr 12 09:12:33 2006 +0000
+++ b/rail_cmd.c	Wed Apr 12 09:36:27 2006 +0000
@@ -703,26 +703,7 @@
 
 					SetSignalType(tile, type == SIGTYPE_COMBO ? SIGTYPE_NORMAL : type + 1);
 				} else {
-					// cycle between two-way -> one-way -> one-way -> ...
-					/* TODO: Rewrite switch into something more general */
-					switch (track) {
-						case TRACK_LOWER:
-						case TRACK_RIGHT: {
-							byte signal = (_m[tile].m3 - 0x10) & 0x30;
-							if (signal == 0) signal = 0x30;
-							_m[tile].m3 &= ~0x30;
-							_m[tile].m3 |= signal;
-							break;
-						}
-
-						default: {
-							byte signal = (_m[tile].m3 - 0x40) & 0xC0;
-							if (signal == 0) signal = 0xC0;
-							_m[tile].m3 &= ~0xC0;
-							_m[tile].m3 |= signal;
-							break;
-						}
-					}
+					CycleSignalSide(tile, track);
 				}
 			}
 		} else {
--- a/rail_map.h	Wed Apr 12 09:12:33 2006 +0000
+++ b/rail_map.h	Wed Apr 12 09:36:27 2006 +0000
@@ -174,6 +174,17 @@
 	return GetSignalType(t) == SIGTYPE_EXIT || GetSignalType(t) == SIGTYPE_COMBO;
 }
 
+static inline void CycleSignalSide(TileIndex t, Track track)
+{
+	byte sig;
+	byte pos = 6;
+	if (track == TRACK_LOWER || track == TRACK_RIGHT) pos = 4;
+
+	sig = GB(_m[t].m3, pos, 2);
+	if (--sig == 0) sig = 3;
+	SB(_m[t].m3, pos, 2, sig);
+}
+
 
 typedef enum SignalVariant {
 	SIG_ELECTRIC  = 0,