mirror of https://github.com/OpenTTD/OpenTTD
(svn r4378) -Add and make use of an accessor function two-way => one-way => one-way => two-way signal cycling
parent
5ae9a03a1f
commit
923a0e60d6
21
rail_cmd.c
21
rail_cmd.c
|
@ -703,26 +703,7 @@ int32 CmdBuildSingleSignal(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
|
|||
|
||||
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 {
|
||||
|
|
11
rail_map.h
11
rail_map.h
|
@ -174,6 +174,17 @@ static inline bool IsPresignalExit(TileIndex t)
|
|||
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,
|
||||
|
|
Loading…
Reference in New Issue