src/rail_map.h
changeset 9790 5d5c70e0334e
parent 9787 cedb26977f52
child 9791 7bcdf05e5e5b
equal deleted inserted replaced
9789:b753e2d50d99 9790:5d5c70e0334e
   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.