src/rail_map.h
branchgamebalance
changeset 9912 1ac8aac92385
parent 9911 0b8b245a2391
child 9694 e72987579514
equal deleted inserted replaced
9911:0b8b245a2391 9912:1ac8aac92385
   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.
   298 static inline bool HasSignalOnTrackdir(TileIndex tile, Trackdir trackdir)
   354 static inline bool HasSignalOnTrackdir(TileIndex tile, Trackdir trackdir)
   299 {
   355 {
   300 	assert (IsValidTrackdir(trackdir));
   356 	assert (IsValidTrackdir(trackdir));
   301 	return
   357 	return
   302 		GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
   358 		GetRailTileType(tile) == RAIL_TILE_SIGNALS &&
   303 		_m[tile].m3 & SignalAlongTrackdir(trackdir);
   359 		GetPresentSignals(tile) & SignalAlongTrackdir(trackdir);
   304 }
   360 }
   305 
   361 
   306 /**
   362 /**
   307  * Gets the state of the signal along the given trackdir.
   363  * Gets the state of the signal along the given trackdir.
   308  *
   364  *
   311  */
   367  */
   312 static inline SignalState GetSignalStateByTrackdir(TileIndex tile, Trackdir trackdir)
   368 static inline SignalState GetSignalStateByTrackdir(TileIndex tile, Trackdir trackdir)
   313 {
   369 {
   314 	assert(IsValidTrackdir(trackdir));
   370 	assert(IsValidTrackdir(trackdir));
   315 	assert(HasSignalOnTrack(tile, TrackdirToTrack(trackdir)));
   371 	assert(HasSignalOnTrack(tile, TrackdirToTrack(trackdir)));
   316 	return _m[tile].m2 & SignalAlongTrackdir(trackdir) ?
   372 	return GetSignalStates(tile) & SignalAlongTrackdir(trackdir) ?
   317 		SIGNAL_STATE_GREEN : SIGNAL_STATE_RED;
   373 		SIGNAL_STATE_GREEN : SIGNAL_STATE_RED;
   318 }
   374 }
   319 
   375 
   320 
   376 
   321 /**
   377 /**