205 SIGTYPE_ENTRY = 1, ///< presignal block entry |
205 SIGTYPE_ENTRY = 1, ///< presignal block entry |
206 SIGTYPE_EXIT = 2, ///< presignal block exit |
206 SIGTYPE_EXIT = 2, ///< presignal block exit |
207 SIGTYPE_COMBO = 3 ///< presignal inter-block |
207 SIGTYPE_COMBO = 3 ///< presignal inter-block |
208 }; |
208 }; |
209 |
209 |
210 static inline SignalType GetSignalType(TileIndex t) |
210 static inline SignalType GetSignalType(TileIndex t, Track track) |
211 { |
211 { |
212 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
212 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
213 return (SignalType)GB(_m[t].m2, 0, 2); |
213 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
214 } |
214 return (SignalType)GB(_m[t].m2, pos, 2); |
215 |
215 } |
216 static inline void SetSignalType(TileIndex t, SignalType s) |
216 |
|
217 static inline void SetSignalType(TileIndex t, Track track, SignalType s) |
217 { |
218 { |
218 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
219 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
219 SB(_m[t].m2, 0, 2, s); |
220 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
220 } |
221 SB(_m[t].m2, pos, 2, s); |
221 |
222 if (track == INVALID_TRACK) SB(_m[t].m2, 4, 2, s); |
222 static inline bool IsPresignalEntry(TileIndex t) |
223 } |
223 { |
224 |
224 return GetSignalType(t) == SIGTYPE_ENTRY || GetSignalType(t) == SIGTYPE_COMBO; |
225 static inline bool IsPresignalEntry(TileIndex t, Track track) |
225 } |
226 { |
226 |
227 return GetSignalType(t, track) == SIGTYPE_ENTRY || GetSignalType(t, track) == SIGTYPE_COMBO; |
227 static inline bool IsPresignalExit(TileIndex t) |
228 } |
228 { |
229 |
229 return GetSignalType(t) == SIGTYPE_EXIT || GetSignalType(t) == SIGTYPE_COMBO; |
230 static inline bool IsPresignalExit(TileIndex t, Track track) |
|
231 { |
|
232 return GetSignalType(t, track) == SIGTYPE_EXIT || GetSignalType(t, track) == SIGTYPE_COMBO; |
230 } |
233 } |
231 |
234 |
232 static inline void CycleSignalSide(TileIndex t, Track track) |
235 static inline void CycleSignalSide(TileIndex t, Track track) |
233 { |
236 { |
234 byte sig; |
237 byte sig; |
235 byte pos = 6; |
238 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 6; |
236 if (track == TRACK_LOWER || track == TRACK_RIGHT) pos = 4; |
|
237 |
239 |
238 sig = GB(_m[t].m3, pos, 2); |
240 sig = GB(_m[t].m3, pos, 2); |
239 if (--sig == 0) sig = 3; |
241 if (--sig == 0) sig = 3; |
240 SB(_m[t].m3, pos, 2, sig); |
242 SB(_m[t].m3, pos, 2, sig); |
241 } |
243 } |
244 enum SignalVariant { |
246 enum SignalVariant { |
245 SIG_ELECTRIC = 0, ///< Light signal |
247 SIG_ELECTRIC = 0, ///< Light signal |
246 SIG_SEMAPHORE = 1 ///< Old-fashioned semaphore signal |
248 SIG_SEMAPHORE = 1 ///< Old-fashioned semaphore signal |
247 }; |
249 }; |
248 |
250 |
249 static inline SignalVariant GetSignalVariant(TileIndex t) |
251 static inline SignalVariant GetSignalVariant(TileIndex t, Track track) |
250 { |
252 { |
251 return (SignalVariant)GB(_m[t].m2, 2, 1); |
253 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2; |
252 } |
254 return (SignalVariant)GB(_m[t].m2, pos, 1); |
253 |
255 } |
254 static inline void SetSignalVariant(TileIndex t, SignalVariant v) |
256 |
255 { |
257 static inline void SetSignalVariant(TileIndex t, Track track, SignalVariant v) |
256 SB(_m[t].m2, 2, 1, v); |
258 { |
257 } |
259 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2; |
258 |
260 SB(_m[t].m2, pos, 1, v); |
259 static inline bool IsSignalPresent(TileIndex t, byte signalbit) |
261 if (track == INVALID_TRACK) SB(_m[t].m2, 6, 1, v); |
260 { |
|
261 return HASBIT(_m[t].m3, signalbit + 4); |
|
262 } |
262 } |
263 |
263 |
264 /** These are states in which a signal can be. Currently these are only two, so |
264 /** These are states in which a signal can be. Currently these are only two, so |
265 * simple boolean logic will do. But do try to compare to this enum instead of |
265 * simple boolean logic will do. But do try to compare to this enum instead of |
266 * normal boolean evaluation, since that will make future additions easier. |
266 * normal boolean evaluation, since that will make future additions easier. |
268 enum SignalState { |
268 enum SignalState { |
269 SIGNAL_STATE_RED = 0, ///< The signal is red |
269 SIGNAL_STATE_RED = 0, ///< The signal is red |
270 SIGNAL_STATE_GREEN = 1, ///< The signal is green |
270 SIGNAL_STATE_GREEN = 1, ///< The signal is green |
271 }; |
271 }; |
272 |
272 |
|
273 /** |
|
274 * Set the states of the signals (Along/AgainstTrackDir) |
|
275 * @param tile the tile to set the states for |
|
276 * @param state the new state |
|
277 */ |
|
278 static inline void SetSignalStates(TileIndex tile, uint state) |
|
279 { |
|
280 SB(_m[tile].m4, 4, 4, state); |
|
281 } |
|
282 |
|
283 /** |
|
284 * Set the states of the signals (Along/AgainstTrackDir) |
|
285 * @param tile the tile to set the states for |
|
286 * @param state the new state |
|
287 */ |
|
288 static inline uint GetSignalStates(TileIndex tile) |
|
289 { |
|
290 return GB(_m[tile].m4, 4, 4); |
|
291 } |
|
292 |
|
293 /** |
|
294 * Get the state of a single signal |
|
295 * @param t the tile to get the signal state for |
|
296 * @param signalbit the signal |
|
297 * @return the state of the signal |
|
298 */ |
273 static inline SignalState GetSingleSignalState(TileIndex t, byte signalbit) |
299 static inline SignalState GetSingleSignalState(TileIndex t, byte signalbit) |
274 { |
300 { |
275 return (SignalState)HASBIT(_m[t].m2, signalbit + 4); |
301 return (SignalState)HASBIT(GetSignalStates(t), signalbit); |
276 } |
302 } |
277 |
303 |
|
304 /** |
|
305 * Set whether the given signals are present (Along/AgainstTrackDir) |
|
306 * @param tile the tile to set the present signals for |
|
307 * @param signals the signals that have to be present |
|
308 */ |
|
309 static inline void SetPresentSignals(TileIndex tile, uint signals) |
|
310 { |
|
311 SB(_m[tile].m3, 4, 4, signals); |
|
312 } |
|
313 |
|
314 /** |
|
315 * Get whether the given signals are present (Along/AgainstTrackDir) |
|
316 * @param tile the tile to get the present signals for |
|
317 * @return the signals that are present |
|
318 */ |
|
319 static inline uint GetPresentSignals(TileIndex tile) |
|
320 { |
|
321 return GB(_m[tile].m3, 4, 4); |
|
322 } |
|
323 |
|
324 /** |
|
325 * Checks whether the given signals is present |
|
326 * @param t the tile to check on |
|
327 * @param signalbit the signal |
|
328 * @return true if and only if the signal is present |
|
329 */ |
|
330 static inline bool IsSignalPresent(TileIndex t, byte signalbit) |
|
331 { |
|
332 return HASBIT(GetPresentSignals(t), signalbit); |
|
333 } |
278 |
334 |
279 /** |
335 /** |
280 * Checks for the presence of signals (either way) on the given track on the |
336 * Checks for the presence of signals (either way) on the given track on the |
281 * given rail tile. |
337 * given rail tile. |
282 */ |
338 */ |
283 static inline bool HasSignalOnTrack(TileIndex tile, Track track) |
339 static inline bool HasSignalOnTrack(TileIndex tile, Track track) |
284 { |
340 { |
285 assert(IsValidTrack(track)); |
341 assert(IsValidTrack(track)); |
286 return |
342 return |
287 GetRailTileType(tile) == RAIL_TILE_SIGNALS && |
343 GetRailTileType(tile) == RAIL_TILE_SIGNALS && |
288 (_m[tile].m3 & SignalOnTrack(track)) != 0; |
344 (GetPresentSignals(tile) & SignalOnTrack(track)) != 0; |
289 } |
345 } |
290 |
346 |
291 /** |
347 /** |
292 * Checks for the presence of signals along the given trackdir on the given |
348 * Checks for the presence of signals along the given trackdir on the given |
293 * rail tile. |
349 * rail tile. |