Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00012 #ifndef SIGNAL_FUNC_H
00013 #define SIGNAL_FUNC_H
00014
00015 #include "signal_type.h"
00016 #include "track_type.h"
00017 #include "tile_type.h"
00018 #include "direction_type.h"
00019 #include "company_type.h"
00020 #include "debug.h"
00021
00026 static inline byte SignalAlongTrackdir(Trackdir trackdir)
00027 {
00028 extern const byte _signal_along_trackdir[TRACKDIR_END];
00029 return _signal_along_trackdir[trackdir];
00030 }
00031
00036 static inline byte SignalAgainstTrackdir(Trackdir trackdir)
00037 {
00038 extern const byte _signal_against_trackdir[TRACKDIR_END];
00039 return _signal_against_trackdir[trackdir];
00040 }
00041
00046 static inline byte SignalOnTrack(Track track)
00047 {
00048 extern const byte _signal_on_track[TRACK_END];
00049 return _signal_on_track[track];
00050 }
00051
00053 static inline bool IsEntrySignal(SignalType type)
00054 {
00055 return type == SIGTYPE_ENTRY || type == SIGTYPE_COMBO || type == SIGTYPE_PROG;
00056 }
00057
00059 static inline bool IsExitSignal(SignalType type)
00060 {
00061 return type == SIGTYPE_EXIT || type == SIGTYPE_COMBO || type == SIGTYPE_PROG;
00062 }
00063
00065 static inline bool IsComboSignal(SignalType type)
00066 {
00067 return type == SIGTYPE_COMBO || type == SIGTYPE_PROG;
00068 }
00069
00071 static inline bool IsPbsSignal(SignalType type)
00072 {
00073 return type == SIGTYPE_PBS || type == SIGTYPE_PBS_ONEWAY;
00074 }
00075
00077 static inline bool IsProgrammableSignal(SignalType type)
00078 {
00079 return type == SIGTYPE_PROG;
00080 }
00081
00083 static inline bool IsSpeedSignal(SignalType type)
00084 {
00085 return type == SIGTYPE_SPEED;
00086 }
00087
00089 static inline bool IsSignalSpritePBS(SignalType type)
00090 {
00091 return type >= SIGTYPE_FIRST_PBS_SPRITE;
00092 }
00093
00094 static inline SignalType NextSignalType(SignalType cur, uint which_signals)
00095 {
00096 bool pbs = (which_signals != 0);
00097 bool block = (which_signals != 1);
00098
00099 switch(cur) {
00100 case SIGTYPE_NORMAL: return block ? SIGTYPE_ENTRY : SIGTYPE_PBS;
00101 case SIGTYPE_ENTRY: return block ? SIGTYPE_EXIT : SIGTYPE_PBS;
00102 case SIGTYPE_EXIT: return block ? SIGTYPE_COMBO : SIGTYPE_PBS;
00103 case SIGTYPE_COMBO: return block ? SIGTYPE_PROG : SIGTYPE_PBS;
00104 case SIGTYPE_PROG: return pbs ? SIGTYPE_PBS : SIGTYPE_NORMAL;
00105 case SIGTYPE_SPEED: return SIGTYPE_SPEED;
00106 case SIGTYPE_PBS: return pbs ? SIGTYPE_PBS_ONEWAY : SIGTYPE_NORMAL;
00107 case SIGTYPE_PBS_ONEWAY: return block ? SIGTYPE_NORMAL : SIGTYPE_PBS;
00108 default:
00109 DEBUG(map, 0, "Attempt to cycle from signal type %d", cur);
00110 return SIGTYPE_NORMAL;
00111 }
00112 }
00113
00115 enum SigSegState {
00116 SIGSEG_FREE,
00117 SIGSEG_FULL,
00118 SIGSEG_PBS,
00119 };
00120
00126 void CheckRemoveSignalsFromTile(TileIndex tile);
00127
00133 void CheckRemoveSignal(TileIndex tile, Track track);
00134
00140 void AddSignalDependency(SignalReference on, SignalReference dep);
00141
00143 void RemoveSignalDependency(SignalReference on, SignalReference dep);
00144
00146 void FreeSignalDependencies();
00147
00148 SigSegState UpdateSignalsOnSegment(TileIndex tile, DiagDirection side, Owner owner);
00149 void SetSignalsOnBothDir(TileIndex tile, Track track, Owner owner);
00150 void AddTrackToSignalBuffer(TileIndex tile, Track track, Owner owner);
00151 void AddSideToSignalBuffer(TileIndex tile, DiagDirection side, Owner owner);
00152 void UpdateSignalsInBuffer();
00153
00154 #endif