changeset 3522:284cd96c8794 draft

(svn r4378) -Add and make use of an accessor function two-way => one-way => one-way => two-way signal cycling
author celestar <celestar@openttd.org>
date Wed, 12 Apr 2006 09:36:27 +0000
parents fb43c34a2b37
children ca4aa6c713e9
files rail_cmd.c rail_map.h
diffstat 2 files changed, 12 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/rail_cmd.c
+++ b/rail_cmd.c
@@ -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
+++ b/rail_map.h
@@ -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,