336 { |
336 { |
337 return GetDepotWaypointReservation(t) ? TrackToTrackBits(GetRailDepotTrack(t)) : TRACK_BIT_NONE; |
337 return GetDepotWaypointReservation(t) ? TrackToTrackBits(GetRailDepotTrack(t)) : TRACK_BIT_NONE; |
338 } |
338 } |
339 |
339 |
340 |
340 |
|
341 static inline bool IsPbsSignal(SignalType s) |
|
342 { |
|
343 return s == SIGTYPE_PBS || s == SIGTYPE_PBS_ONEWAY; |
|
344 } |
|
345 |
341 static inline SignalType GetSignalType(TileIndex t, Track track) |
346 static inline SignalType GetSignalType(TileIndex t, Track track) |
342 { |
347 { |
343 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
348 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
344 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
349 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
345 return (SignalType)GB(_m[t].m2, pos, 2); |
350 return (SignalType)GB(_m[t].m2, pos, 3); |
346 } |
351 } |
347 |
352 |
348 static inline void SetSignalType(TileIndex t, Track track, SignalType s) |
353 static inline void SetSignalType(TileIndex t, Track track, SignalType s) |
349 { |
354 { |
350 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
355 assert(GetRailTileType(t) == RAIL_TILE_SIGNALS); |
351 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
356 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 4 : 0; |
352 SB(_m[t].m2, pos, 2, s); |
357 SB(_m[t].m2, pos, 3, s); |
353 if (track == INVALID_TRACK) SB(_m[t].m2, 4, 2, s); |
358 if (track == INVALID_TRACK) SB(_m[t].m2, 4, 3, s); |
354 } |
359 } |
355 |
360 |
356 static inline bool IsPresignalEntry(TileIndex t, Track track) |
361 static inline bool IsPresignalEntry(TileIndex t, Track track) |
357 { |
362 { |
358 return GetSignalType(t, track) == SIGTYPE_ENTRY || GetSignalType(t, track) == SIGTYPE_COMBO; |
363 return GetSignalType(t, track) == SIGTYPE_ENTRY || GetSignalType(t, track) == SIGTYPE_COMBO; |
373 SB(_m[t].m3, pos, 2, sig); |
378 SB(_m[t].m3, pos, 2, sig); |
374 } |
379 } |
375 |
380 |
376 static inline SignalVariant GetSignalVariant(TileIndex t, Track track) |
381 static inline SignalVariant GetSignalVariant(TileIndex t, Track track) |
377 { |
382 { |
378 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2; |
383 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 7 : 3; |
379 return (SignalVariant)GB(_m[t].m2, pos, 1); |
384 return (SignalVariant)GB(_m[t].m2, pos, 1); |
380 } |
385 } |
381 |
386 |
382 static inline void SetSignalVariant(TileIndex t, Track track, SignalVariant v) |
387 static inline void SetSignalVariant(TileIndex t, Track track, SignalVariant v) |
383 { |
388 { |
384 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2; |
389 byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 7 : 3; |
385 SB(_m[t].m2, pos, 1, v); |
390 SB(_m[t].m2, pos, 1, v); |
386 if (track == INVALID_TRACK) SB(_m[t].m2, 6, 1, v); |
391 if (track == INVALID_TRACK) SB(_m[t].m2, 7, 1, v); |
387 } |
392 } |
388 |
393 |
389 /** These are states in which a signal can be. Currently these are only two, so |
394 /** These are states in which a signal can be. Currently these are only two, so |
390 * simple boolean logic will do. But do try to compare to this enum instead of |
395 * simple boolean logic will do. But do try to compare to this enum instead of |
391 * normal boolean evaluation, since that will make future additions easier. |
396 * normal boolean evaluation, since that will make future additions easier. |
506 if (state == SIGNAL_STATE_GREEN) { // set 1 |
511 if (state == SIGNAL_STATE_GREEN) { // set 1 |
507 SetSignalStates(tile, GetSignalStates(tile) | SignalAlongTrackdir(trackdir)); |
512 SetSignalStates(tile, GetSignalStates(tile) | SignalAlongTrackdir(trackdir)); |
508 } else { |
513 } else { |
509 SetSignalStates(tile, GetSignalStates(tile) & ~SignalAlongTrackdir(trackdir)); |
514 SetSignalStates(tile, GetSignalStates(tile) & ~SignalAlongTrackdir(trackdir)); |
510 } |
515 } |
|
516 } |
|
517 |
|
518 /** |
|
519 * Is a pbs signal present along the trackdir? |
|
520 * @param tile the tile to check |
|
521 * @param td the trackdir to check |
|
522 */ |
|
523 static inline bool HasPbsSignalOnTrackdir(TileIndex tile, Trackdir td) |
|
524 { |
|
525 return |
|
526 IsTileType(tile, MP_RAILWAY) && |
|
527 HasSignalOnTrackdir(tile, td) && |
|
528 IsPbsSignal(GetSignalType(tile, TrackdirToTrack(td))); |
511 } |
529 } |
512 |
530 |
513 |
531 |
514 /** |
532 /** |
515 * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile. |
533 * Return the rail type of tile, or INVALID_RAILTYPE if this is no rail tile. |