@ -269,7 +269,7 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
tile = TileVirtXY ( x , y ) ;
tileh = GetTileSlope ( tile , NULL ) ;
m5 = _m ap5 [ tile ] ;
m5 = _m [ tile ] . m5 ;
trackbit = TrackToTrackBits ( track ) ;
SET_EXPENSES_TYPE ( EXPENSES_CONSTRUCTION ) ;
@ -290,9 +290,9 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ( flags & DC_EXEC ) {
SetTileOwner ( tile , _current_player ) ;
_m ap3_lo [ tile ] & = ~ 0x0F ;
_m ap3_lo [ tile ] | = p1 ;
_m ap5 [ tile ] = ( m5 & 0xC7 ) | 0x20 ; // railroad under bridge
_m [ tile ] . m3 & = ~ 0x0F ;
_m [ tile ] . m3 | = p1 ;
_m [ tile ] . m5 = ( m5 & 0xC7 ) | 0x20 ; // railroad under bridge
}
break ;
@ -312,7 +312,7 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
}
if ( m5 & RAIL_TYPE_SPECIAL | |
! IsTileOwner ( tile , _current_player ) | |
( _m ap3_lo [ tile ] & 0xFU ) ! = p1 ) {
( _m [ tile ] . m3 & 0xFU ) ! = p1 ) {
// Get detailed error message
return DoCommandByTile ( tile , 0 , 0 , flags , CMD_LANDSCAPE_CLEAR ) ;
}
@ -322,8 +322,8 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
cost + = ret ;
if ( flags & DC_EXEC ) {
_m ap2 [ tile ] & = ~ RAIL_MAP2LO_GROUND_MASK ; // Bare land
_m ap5 [ tile ] = m5 | trackbit ;
_m [ tile ] . m2 & = ~ RAIL_MAP2LO_GROUND_MASK ; // Bare land
_m [ tile ] . m5 = m5 | trackbit ;
}
break ;
@ -337,10 +337,10 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
( track = = TRACK_DIAG2 & & m5 = = 0x0A ) // correct direction?
) ) {
if ( flags & DC_EXEC ) {
_m ap3_lo [ tile ] = GetTileOwner ( tile ) ;
_m [ tile ] . m3 = GetTileOwner ( tile ) ;
SetTileOwner ( tile , _current_player ) ;
_m ap3_hi [ tile ] = p1 ;
_m ap5 [ tile ] = 0x10 | ( track = = TRACK_DIAG1 ? 0x08 : 0x00 ) ; // level crossing
_m [ tile ] . m4 = p1 ;
_m [ tile ] . m5 = 0x10 | ( track = = TRACK_DIAG1 ? 0x08 : 0x00 ) ; // level crossing
}
break ;
}
@ -361,9 +361,9 @@ int32 CmdBuildSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ( flags & DC_EXEC ) {
SetTileType ( tile , MP_RAILWAY ) ;
SetTileOwner ( tile , _current_player ) ;
_m ap2 [ tile ] = 0 ; // Bare land
_m ap3_lo [ tile ] = p1 ; // No signals, rail type
_m ap5 [ tile ] = trackbit ;
_m [ tile ] . m2 = 0 ; // Bare land
_m [ tile ] . m3 = p1 ; // No signals, rail type
_m [ tile ] . m5 = trackbit ;
}
break ;
}
@ -430,27 +430,27 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ( ! EnsureNoVehicleZ ( tile , TilePixelHeight ( tile ) ) )
return CMD_ERROR ;
if ( ( _m ap5 [ tile ] & 0xF8 ) ! = 0xE0 )
if ( ( _m [ tile ] . m5 & 0xF8 ) ! = 0xE0 )
return CMD_ERROR ;
if ( ( ( _m ap5 [ tile ] & 1 ) ? 1 : 2 ) ! = trackbit )
if ( ( ( _m [ tile ] . m5 & 1 ) ? 1 : 2 ) ! = trackbit )
return CMD_ERROR ;
if ( ! ( flags & DC_EXEC ) )
return _price . remove_rail ;
SetTileOwner ( tile , OWNER_NONE ) ;
_m ap5 [ tile ] = _m ap5 [ tile ] & 0xC7 ;
_m [ tile ] . m5 = _m [ tile ] . m5 & 0xC7 ;
break ;
case MP_STREET :
if ( ! ( _m ap5 [ tile ] & 0xF0 ) )
if ( ! ( _m [ tile ] . m5 & 0xF0 ) )
return CMD_ERROR ;
if ( _m ap5 [ tile ] & 0xE0 )
if ( _m [ tile ] . m5 & 0xE0 )
return CMD_ERROR ;
/* This is a crossing, let's check if the direction is correct */
if ( _m ap5 [ tile ] & 8 ) {
if ( _m [ tile ] . m5 & 8 ) {
m5 = 5 ;
if ( track ! = TRACK_DIAG1 )
return CMD_ERROR ;
@ -463,9 +463,9 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ( ! ( flags & DC_EXEC ) )
return _price . remove_rail ;
_m ap5 [ tile ] = m5 ;
SetTileOwner ( tile , _m ap3_lo [ tile ] ) ;
_m ap2 [ tile ] = 0 ;
_m [ tile ] . m5 = m5 ;
SetTileOwner ( tile , _m [ tile ] . m3 ) ;
_m [ tile ] . m2 = 0 ;
break ;
case MP_RAILWAY :
@ -484,7 +484,7 @@ int32 CmdRemoveSingleRail(int x, int y, uint32 flags, uint32 p1, uint32 p2)
return cost ;
/* We remove the trackbit here. */
_m ap5 [ tile ] & = ~ trackbit ;
_m [ tile ] . m5 & = ~ trackbit ;
if ( GetTrackBits ( tile ) = = 0 ) {
/* The tile has no tracks left, it is no longer a rail tile */
@ -710,7 +710,7 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* Protect against invalid signal copying */
if ( p2 ! = 0 & & ( p2 & SignalOnTrack ( track ) ) = = 0 ) return CMD_ERROR ;
m5 = _m ap5 [ tile ] ;
m5 = _m [ tile ] . m5 ;
/* You can only build signals on plain rail tiles, and the selected track must exist */
if ( ! IsPlainRailTile ( tile ) | | ! HasTrack ( tile , track ) ) return CMD_ERROR ;
@ -747,40 +747,40 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
if ( flags & DC_EXEC ) {
if ( GetRailTileType ( tile ) ! = RAIL_TYPE_SIGNALS ) {
// there are no signals at all on this tile yet
_m ap5 [ tile ] | = RAIL_TYPE_SIGNALS ; // change into signals
_m ap2 [ tile ] | = 0xF0 ; // all signals are on
_m ap3_lo [ tile ] & = ~ 0xF0 ; // no signals built by default
_m ap3_hi [ tile ] = semaphore ? 0x08 : 0 ;
_m [ tile ] . m5 | = RAIL_TYPE_SIGNALS ; // change into signals
_m [ tile ] . m2 | = 0xF0 ; // all signals are on
_m [ tile ] . m3 & = ~ 0xF0 ; // no signals built by default
_m [ tile ] . m4 = semaphore ? 0x08 : 0 ;
}
if ( p2 = = 0 ) {
if ( ! HasSignalOnTrack ( tile , track ) ) {
// build new signals
_m ap3_lo [ tile ] | = SignalOnTrack ( track ) ;
_m [ tile ] . m3 | = SignalOnTrack ( track ) ;
} else {
if ( pre_signal ) {
// cycle between normal -> pre -> exit -> combo -> pbs ->...
byte type = ( ( GetSignalType ( tile , track ) + 1 ) % 5 ) ;
_m ap3_hi [ tile ] & = ~ 0x07 ;
_m ap3_hi [ tile ] | = type ;
_m [ tile ] . m4 & = ~ 0x07 ;
_m [ tile ] . m4 | = type ;
} else {
// cycle between two-way -> one-way -> one-way -> ...
/* TODO: Rewrite switch into something more general */
switch ( track ) {
case TRACK_LOWER :
case TRACK_RIGHT : {
byte signal = ( _m ap3_lo [ tile ] - 0x10 ) & 0x30 ;
byte signal = ( _m [ tile ] . m3 - 0x10 ) & 0x30 ;
if ( signal = = 0 ) signal = 0x30 ;
_m ap3_lo [ tile ] & = ~ 0x30 ;
_m ap3_lo [ tile ] | = signal ;
_m [ tile ] . m3 & = ~ 0x30 ;
_m [ tile ] . m3 | = signal ;
break ;
}
default : {
byte signal = ( _m ap3_lo [ tile ] - 0x40 ) & 0xC0 ;
byte signal = ( _m [ tile ] . m3 - 0x40 ) & 0xC0 ;
if ( signal = = 0 ) signal = 0xC0 ;
_m ap3_lo [ tile ] & = ~ 0xC0 ;
_m ap3_lo [ tile ] | = signal ;
_m [ tile ] . m3 & = ~ 0xC0 ;
_m [ tile ] . m3 | = signal ;
break ;
}
}
@ -789,13 +789,13 @@ int32 CmdBuildSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
} else {
/* If CmdBuildManySignals is called with copying signals, just copy the
* direction of the first signal given as parameter by CmdBuildManySignals */
_m ap3_lo [ tile ] & = ~ SignalOnTrack ( track ) ;
_m ap3_lo [ tile ] | = p2 & SignalOnTrack ( track ) ;
_m [ tile ] . m3 & = ~ SignalOnTrack ( track ) ;
_m [ tile ] . m3 | = p2 & SignalOnTrack ( track ) ;
// convert between signal<->semaphores when dragging
if ( semaphore )
SETBIT ( _m ap3_hi [ tile ] , 3 ) ;
SETBIT ( _m [ tile ] . m4 , 3 ) ;
else
CLRBIT ( _m ap3_hi [ tile ] , 3 ) ;
CLRBIT ( _m [ tile ] . m4 , 3 ) ;
}
MarkTileDirtyByTile ( tile ) ;
@ -851,7 +851,7 @@ static int32 CmdSignalTrackHelper(int x, int y, uint32 flags, uint32 p1, uint32
// copy the signal-style of the first rail-piece if existing
if ( GetRailTileType ( tile ) = = RAIL_TYPE_SIGNALS & & GetTrackBits ( tile ) ! = 0 ) { /* XXX: GetTrackBits check useless? */
signals = _m ap3_lo [ tile ] & SignalOnTrack ( track ) ;
signals = _m [ tile ] . m3 & SignalOnTrack ( track ) ;
if ( signals = = 0 ) signals = SignalOnTrack ( track ) ; /* Can this actually occur? */
semaphores = ( HasSemaphores ( tile , track ) ? 8 : 0 ) ; // copy signal/semaphores style (independent of CTRL)
@ -926,13 +926,13 @@ int32 CmdRemoveSingleSignal(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* Do it? */
if ( flags & DC_EXEC ) {
_m ap3_lo [ tile ] & = ~ SignalOnTrack ( track ) ;
_m [ tile ] . m3 & = ~ SignalOnTrack ( track ) ;
/* removed last signal from tile? */
if ( ( _m ap3_lo [ tile ] & 0xF0 ) = = 0 ) {
_m ap5 [ tile ] & = ~ RAIL_TYPE_SIGNALS ;
_m ap2 [ tile ] & = ~ 0xF0 ;
CLRBIT ( _m ap3_hi [ tile ] , 3 ) ; // remove any possible semaphores
if ( ( _m [ tile ] . m3 & 0xF0 ) = = 0 ) {
_m [ tile ] . m5 & = ~ RAIL_TYPE_SIGNALS ;
_m [ tile ] . m2 & = ~ 0xF0 ;
CLRBIT ( _m [ tile ] . m4 , 3 ) ; // remove any possible semaphores
}
SetSignalsOnBothDir ( tile , track ) ;
@ -965,7 +965,7 @@ static int32 DoConvertRail(TileIndex tile, uint totype, bool exec)
// change type.
if ( exec ) {
_m ap3_lo [ tile ] = ( _m ap3_lo [ tile ] & 0xF0 ) + totype ;
_m [ tile ] . m3 = ( _m [ tile ] . m3 & 0xF0 ) + totype ;
MarkTileDirtyByTile ( tile ) ;
}
@ -1050,7 +1050,7 @@ static int32 ClearTile_Track(TileIndex tile, byte flags)
int32 ret ;
byte m5 ;
m5 = _m ap5 [ tile ] ;
m5 = _m [ tile ] . m5 ;
if ( flags & DC_AUTO ) {
if ( m5 & RAIL_TYPE_SPECIAL )
@ -1066,12 +1066,12 @@ static int32 ClearTile_Track(TileIndex tile, byte flags)
switch ( GetRailTileType ( tile ) ) {
case RAIL_TYPE_SIGNALS :
if ( _m ap3_lo [ tile ] & _signals_table_both [ 0 ] ) {
if ( _m [ tile ] . m3 & _signals_table_both [ 0 ] ) {
ret = DoCommandByTile ( tile , 0 , 0 , flags , CMD_REMOVE_SIGNALS ) ;
if ( ret = = CMD_ERROR ) return CMD_ERROR ;
cost + = ret ;
}
if ( _m ap3_lo [ tile ] & _signals_table_both [ 3 ] ) {
if ( _m [ tile ] . m3 & _signals_table_both [ 3 ] ) {
ret = DoCommandByTile ( tile , 3 , 0 , flags , CMD_REMOVE_SIGNALS ) ;
if ( ret = = CMD_ERROR ) return CMD_ERROR ;
cost + = ret ;
@ -1184,7 +1184,7 @@ static void DrawSignalHelper(TileInfo *ti, byte condition, uint32 image_and_pos)
uint v = _signal_position [ ( image_and_pos & 0xF ) + ( otherside ? 12 : 0 ) ] ;
uint x = ti - > x | ( v & 0xF ) ;
uint y = ti - > y | ( v > > 4 ) ;
uint sprite = _signal_base_sprites [ ( _m ap3_hi [ ti - > tile ] & 0xF ) + ( otherside ? 0x10 : 0 ) ] + ( image_and_pos > > 4 ) + ( ( condition ! = 0 ) ? 1 : 0 ) ;
uint sprite = _signal_base_sprites [ ( _m [ ti - > tile ] . m4 & 0xF ) + ( otherside ? 0x10 : 0 ) ] + ( image_and_pos > > 4 ) + ( ( condition ! = 0 ) ? 1 : 0 ) ;
AddSortableSpriteToDraw ( sprite , x , y , 1 , 1 , 10 , GetSlopeZ ( x , y ) ) ;
}
@ -1419,7 +1419,7 @@ static void DrawTile_Track(TileInfo *ti)
_drawtile_track_palette = SPRITE_PALETTE ( PLAYER_SPRITE_COLOR ( GetTileOwner ( ti - > tile ) ) ) ;
tracktype_offs = ( _m ap3_lo [ ti - > tile ] & 0xF ) * TRACKTYPE_SPRITE_PITCH ;
tracktype_offs = ( _m [ ti - > tile ] . m3 & 0xF ) * TRACKTYPE_SPRITE_PITCH ;
m5 = ( byte ) ti - > map5 ;
if ( ! ( m5 & RAIL_TYPE_SPECIAL ) ) {
@ -1457,9 +1457,9 @@ static void DrawTile_Track(TileInfo *ti)
if ( ti - > tileh ! = 0 ) image = _track_sloped_sprites [ ti - > tileh - 1 ] + TrackSet [ TRACK_Y ] ;
}
if ( ( _m ap2 [ ti - > tile ] & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_BROWN ) {
if ( ( _m [ ti - > tile ] . m2 & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_BROWN ) {
image = ( image & 0xFFFF ) | 0x3178000 ; // use a brown palette
} else if ( ( _m ap2 [ ti - > tile ] & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_ICE_DESERT ) {
} else if ( ( _m [ ti - > tile ] . m2 & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_ICE_DESERT ) {
image + = TrackSet [ SNOW_OFFSET ] ;
}
@ -1485,7 +1485,7 @@ static void DrawTile_Track(TileInfo *ti)
}
if ( _display_opt & DO_FULL_DETAIL ) {
_detailed_track_proc [ _m ap2 [ ti - > tile ] & RAIL_MAP2LO_GROUND_MASK ] ( ti ) ;
_detailed_track_proc [ _m [ ti - > tile ] . m2 & RAIL_MAP2LO_GROUND_MASK ] ( ti ) ;
}
/* draw signals also? */
@ -1495,7 +1495,7 @@ static void DrawTile_Track(TileInfo *ti)
{
byte m23 ;
m23 = ( _m ap3_lo [ ti - > tile ] > > 4 ) | ( _m ap2 [ ti - > tile ] & 0xF0 ) ;
m23 = ( _m [ ti - > tile ] . m3 > > 4 ) | ( _m [ ti - > tile ] . m2 & 0xF0 ) ;
# define HAS_SIGNAL(x) (m23 & (byte)(0x1 << (x)))
# define ISON_SIGNAL(x) (m23 & (byte)(0x10 << (x)))
@ -1541,16 +1541,16 @@ static void DrawTile_Track(TileInfo *ti)
if ( ti - > tileh ! = 0 ) { DrawFoundation ( ti , ti - > tileh ) ; }
if ( IsRailWaypoint ( m5 ) & & _m ap3_lo [ ti - > tile ] & 16 ) {
if ( IsRailWaypoint ( m5 ) & & _m [ ti - > tile ] . m3 & 16 ) {
// look for customization
StationSpec * stat = GetCustomStation ( STAT_CLASS_WAYP , _m ap3_hi [ ti - > tile ] ) ;
StationSpec * stat = GetCustomStation ( STAT_CLASS_WAYP , _m [ ti - > tile ] . m4 ) ;
if ( stat ) {
DrawTileSeqStruct const * seq ;
// emulate station tile - open with building
DrawTileSprites * cust = & stat - > renderdata [ 2 + ( m5 & 0x1 ) ] ;
uint32 relocation = GetCustomStationRelocation ( stat , ComposeWaypointStation ( ti - > tile ) , 0 ) ;
int railtype = ( _m ap3_lo [ ti - > tile ] & 0xF ) ;
int railtype = ( _m [ ti - > tile ] . m3 & 0xF ) ;
/* We don't touch the 0x8000 bit. In all this
* waypoint code , it is used to indicate that
@ -1583,7 +1583,7 @@ static void DrawTile_Track(TileInfo *ti)
// adjust ground tile for desert
// (don't adjust for arctic depots, because snow in depots looks weird)
if ( ( _m ap2 [ ti - > tile ] & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_ICE_DESERT & & ( _opt . landscape = = LT_DESERT | | type > = 4 ) )
if ( ( _m [ ti - > tile ] . m2 & RAIL_MAP2LO_GROUND_MASK ) = = RAIL_GROUND_ICE_DESERT & & ( _opt . landscape = = LT_DESERT | | type > = 4 ) )
{
if ( image ! = 3981 )
image + = 26 ; // tile with tracks
@ -1673,7 +1673,7 @@ static bool SetSignalsEnumProc(TileIndex tile, SetSignalsData *ssd, int track, u
// the tile has signals?
if ( IsTileType ( tile , MP_RAILWAY ) ) {
if ( HasSignalOnTrack ( tile , TrackdirToTrack ( track ) ) ) {
if ( ( _m ap3_lo [ tile ] & _signals_table [ track ] ) ! = 0 ) {
if ( ( _m [ tile ] . m3 & _signals_table [ track ] ) ! = 0 ) {
// yes, add the signal to the list of signals
if ( ssd - > cur ! = NUM_SSD_ENTRY ) {
ssd - > tile [ ssd - > cur ] = tile ; // remember the tile index
@ -1685,7 +1685,7 @@ static bool SetSignalsEnumProc(TileIndex tile, SetSignalsData *ssd, int track, u
SETBIT ( ssd - > has_pbssignal , 2 ) ;
// remember if this block has a presignal.
ssd - > has_presignal | = ( _m ap3_hi [ tile ] & 1 ) ;
ssd - > has_presignal | = ( _m [ tile ] . m4 & 1 ) ;
}
if ( PBSIsPbsSignal ( tile , ReverseTrackdir ( track ) ) | | PBSIsPbsSignal ( tile , track ) ) {
@ -1695,16 +1695,16 @@ static bool SetSignalsEnumProc(TileIndex tile, SetSignalsData *ssd, int track, u
ssd - > has_pbssignal | = num ;
}
if ( ( _m ap3_lo [ tile ] & _signals_table_both [ track ] ) ! = 0 ) {
if ( ( _m [ tile ] . m3 & _signals_table_both [ track ] ) ! = 0 ) {
ssd - > pbs_tile [ ssd - > pbs_cur ] = tile ; // remember the tile index
ssd - > pbs_cur + + ;
}
if ( _m ap3_lo [ tile ] & _signals_table_other [ track ] ) {
if ( _m ap3_hi [ tile ] & 2 ) {
if ( _m [ tile ] . m3 & _signals_table_other [ track ] ) {
if ( _m [ tile ] . m4 & 2 ) {
// this is an exit signal that points out from the segment
ssd - > presignal_exits + + ;
if ( ( _m ap2 [ tile ] & _signals_table_other [ track ] ) ! = 0 )
if ( ( _m [ tile ] . m2 & _signals_table_other [ track ] ) ! = 0 )
ssd - > presignal_exits_free + + ;
}
if ( PBSIsPbsSignal ( tile , track ) )
@ -1761,10 +1761,10 @@ bool SignalVehicleCheck(TileIndex tile, uint track)
* is some kind of invisible black hole , and there is some special magic going
* on in there . This ' workaround ' can be removed once the maprewrite is done .
*/
if ( GetTileType ( tile ) = = MP_TUNNELBRIDGE & & ( ( _m ap5 [ tile ] & 0xF0 ) = = 0 ) ) {
if ( GetTileType ( tile ) = = MP_TUNNELBRIDGE & & ( ( _m [ tile ] . m5 & 0xF0 ) = = 0 ) ) {
// It is a tunnel we're checking, we need to do some special stuff
// because VehicleFromPos will not find the vihicle otherwise
byte direction = _m ap5 [ tile ] & 3 ;
byte direction = _m [ tile ] . m5 & 3 ;
FindLengthOfTunnelResult flotr ;
flotr = FindLengthOfTunnel ( tile , direction ) ;
dest . track = 1 < < ( direction & 1 ) ; // get the trackbit the vehicle would have if it has not entered the tunnel yet (ie is still visible)
@ -1849,8 +1849,8 @@ static void ChangeSignalStates(SetSignalsData *ssd)
if ( _patches . auto_pbs_placement & & ! ( ssd - > stop ) & & ( ssd - > has_pbssignal = = 0xE ) & & ! ssd - > has_presignal & & ( ssd - > presignal_exits = = 0 ) ) // 0xE means at least 2 pbs signals, and at least 1 entry and 1 exit, see comments ssd->has_pbssignal
for ( i = 0 ; i ! = ssd - > pbs_cur ; i + + ) {
TileIndex tile = ssd - > pbs_tile [ i ] ;
_m ap3_hi [ tile ] & = ~ 0x07 ;
_m ap3_hi [ tile ] | = 0x04 ;
_m [ tile ] . m4 & = ~ 0x07 ;
_m [ tile ] . m4 | = 0x04 ;
MarkTileDirtyByTile ( tile ) ;
} ;
@ -1858,16 +1858,16 @@ static void ChangeSignalStates(SetSignalsData *ssd)
for ( i = 0 ; i ! = ssd - > cur ; i + + ) {
TileIndex tile = ssd - > tile [ i ] ;
byte bit = _signals_table [ ssd - > bit [ i ] ] ;
uint16 m2 = _m ap2 [ tile ] ;
uint16 m2 = _m [ tile ] . m2 ;
// presignals don't turn green if there is at least one presignal exit and none are free
if ( _m ap3_hi [ tile ] & 1 ) {
if ( _m [ tile ] . m4 & 1 ) {
int ex = ssd - > presignal_exits , exfree = ssd - > presignal_exits_free ;
// subtract for dual combo signals so they don't count themselves
if ( _m ap3_hi [ tile ] & 2 & & _m ap3_lo [ tile ] & _signals_table_other [ ssd - > bit [ i ] ] ) {
if ( _m [ tile ] . m4 & 2 & & _m [ tile ] . m3 & _signals_table_other [ ssd - > bit [ i ] ] ) {
ex - - ;
if ( ( _m ap2 [ tile ] & _signals_table_other [ ssd - > bit [ i ] ] ) ! = 0 ) exfree - - ;
if ( ( _m [ tile ] . m2 & _signals_table_other [ ssd - > bit [ i ] ] ) ! = 0 ) exfree - - ;
}
// if we have exits and none are free, make red.
@ -1887,7 +1887,7 @@ make_red:
}
/* Update signals on the other side of this exit-combo signal; it changed. */
if ( _m ap3_hi [ tile ] & 2 ) {
if ( _m [ tile ] . m4 & 2 ) {
if ( ssd - > cur_stack ! = NUM_SSD_STACK ) {
ssd - > next_tile [ ssd - > cur_stack ] = tile ;
ssd - > next_dir [ ssd - > cur_stack ] = _dir_from_track [ ssd - > bit [ i ] ] ;
@ -1898,7 +1898,7 @@ make_red:
}
// it changed, so toggle it
_m ap2 [ tile ] = m2 ^ bit ;
_m [ tile ] . m2 = m2 ^ bit ;
MarkTileDirtyByTile ( tile ) ;
}
}
@ -2010,7 +2010,7 @@ static void TileLoop_Track(TileIndex tile)
uint16 m2 ;
byte owner ;
m2 = _m ap2 [ tile ] & 0xF ;
m2 = _m [ tile ] . m2 & 0xF ;
/* special code for alps landscape */
if ( _opt . landscape = = LT_HILLY ) {
@ -2030,14 +2030,14 @@ static void TileLoop_Track(TileIndex tile)
}
// Don't continue tile loop for depots
if ( _m ap5 [ tile ] & RAIL_TYPE_SPECIAL )
if ( _m [ tile ] . m5 & RAIL_TYPE_SPECIAL )
return ;
a2 = RAIL_GROUND_GREEN ;
if ( m2 ! = RAIL_GROUND_BROWN ) { /* wait until bottom is green */
/* determine direction of fence */
rail = _m ap5 [ tile ] & TRACK_BIT_MASK ;
rail = _m [ tile ] . m5 & TRACK_BIT_MASK ;
if ( rail = = TRACK_BIT_UPPER ) {
a2 = RAIL_GROUND_FENCE_HORIZ1 ;
@ -2053,28 +2053,28 @@ static void TileLoop_Track(TileIndex tile)
if ( ( ! ( rail & ( TRACK_BIT_DIAG2 | TRACK_BIT_UPPER | TRACK_BIT_LEFT ) ) & & ( rail & TRACK_BIT_DIAG1 ) ) | | rail = = ( TRACK_BIT_LOWER | TRACK_BIT_RIGHT ) ) {
if ( ! IsTileType ( tile + TileDiffXY ( 0 , - 1 ) , MP_RAILWAY ) | |
! IsTileOwner ( tile + TileDiffXY ( 0 , - 1 ) , owner ) | |
( _m ap5[ tile + TileDiffXY ( 0 , - 1 ) ] = = TRACK_BIT_UPPER | | _map5 [ tile + TileDiffXY ( 0 , - 1 ) ] = = TRACK_BIT_LEFT ) )
( _m [ tile + TileDiffXY ( 0 , - 1 ) ] . m5 = = TRACK_BIT_UPPER | | _m [ tile + TileDiffXY ( 0 , - 1 ) ] . m5 = = TRACK_BIT_LEFT ) )
a2 = RAIL_GROUND_FENCE_NW ;
}
if ( ( ! ( rail & ( TRACK_BIT_DIAG2 | TRACK_BIT_LOWER | TRACK_BIT_RIGHT ) ) & & ( rail & TRACK_BIT_DIAG1 ) ) | | rail = = ( TRACK_BIT_UPPER | TRACK_BIT_LEFT ) ) {
if ( ! IsTileType ( tile + TileDiffXY ( 0 , 1 ) , MP_RAILWAY ) | |
! IsTileOwner ( tile + TileDiffXY ( 0 , 1 ) , owner ) | |
( _m ap5[ tile + TileDiffXY ( 0 , 1 ) ] = = TRACK_BIT_LOWER | | _map5 [ tile + TileDiffXY ( 0 , 1 ) ] = = TRACK_BIT_RIGHT ) )
( _m [ tile + TileDiffXY ( 0 , 1 ) ] . m5 = = TRACK_BIT_LOWER | | _m [ tile + TileDiffXY ( 0 , 1 ) ] . m5 = = TRACK_BIT_RIGHT ) )
a2 = ( a2 = = RAIL_GROUND_FENCE_NW ) ? RAIL_GROUND_FENCE_SENW : RAIL_GROUND_FENCE_SE ;
}
if ( ( ! ( rail & ( TRACK_BIT_DIAG1 | TRACK_BIT_UPPER | TRACK_BIT_RIGHT ) ) & & ( rail & TRACK_BIT_DIAG2 ) ) | | rail = = ( TRACK_BIT_LOWER | TRACK_BIT_LEFT ) ) {
if ( ! IsTileType ( tile + TileDiffXY ( - 1 , 0 ) , MP_RAILWAY ) | |
! IsTileOwner ( tile + TileDiffXY ( - 1 , 0 ) , owner ) | |
( _m ap5[ tile + TileDiffXY ( - 1 , 0 ) ] = = TRACK_BIT_UPPER | | _map5 [ tile + TileDiffXY ( - 1 , 0 ) ] = = TRACK_BIT_RIGHT ) )
( _m [ tile + TileDiffXY ( - 1 , 0 ) ] . m5 = = TRACK_BIT_UPPER | | _m [ tile + TileDiffXY ( - 1 , 0 ) ] . m5 = = TRACK_BIT_RIGHT ) )
a2 = RAIL_GROUND_FENCE_NE ;
}
if ( ( ! ( rail & ( TRACK_BIT_DIAG1 | TRACK_BIT_LOWER | TRACK_BIT_LEFT ) ) & & ( rail & TRACK_BIT_DIAG2 ) ) | | rail = = ( TRACK_BIT_UPPER | TRACK_BIT_RIGHT ) ) {
if ( ! IsTileType ( tile + TileDiffXY ( 1 , 0 ) , MP_RAILWAY ) | |
! IsTileOwner ( tile + TileDiffXY ( 1 , 0 ) , owner ) | |
( _m ap5[ tile + TileDiffXY ( 1 , 0 ) ] = = TRACK_BIT_LOWER | | _map5 [ tile + TileDiffXY ( 1 , 0 ) ] = = TRACK_BIT_LEFT ) )
( _m [ tile + TileDiffXY ( 1 , 0 ) ] . m5 = = TRACK_BIT_LOWER | | _m [ tile + TileDiffXY ( 1 , 0 ) ] . m5 = = TRACK_BIT_LEFT ) )
a2 = ( a2 = = RAIL_GROUND_FENCE_NE ) ? RAIL_GROUND_FENCE_NESW : RAIL_GROUND_FENCE_SW ;
}
}
@ -2083,7 +2083,7 @@ static void TileLoop_Track(TileIndex tile)
modify_me : ;
/* tile changed? */
if ( m2 ! = a2 ) {
_m ap2 [ tile ] = ( _m ap2 [ tile ] & ~ RAIL_MAP2LO_GROUND_MASK ) | a2 ;
_m [ tile ] . m2 = ( _m [ tile ] . m2 & ~ RAIL_MAP2LO_GROUND_MASK ) | a2 ;
MarkTileDirtyByTile ( tile ) ;
}
}
@ -2098,7 +2098,7 @@ static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode)
if ( mode ! = TRANSPORT_RAIL )
return 0 ;
m5 = _m ap5 [ tile ] ;
m5 = _m [ tile ] . m5 ;
if ( ! ( m5 & RAIL_TYPE_SPECIAL ) ) {
ret = ( m5 | ( m5 < < 8 ) ) & 0x3F3F ;
@ -2109,8 +2109,8 @@ static uint32 GetTileTrackStatus_Track(TileIndex tile, TransportType mode)
} else {
/* has_signals */
a = _m ap3_lo [ tile ] ;
b = _m ap2 [ tile ] ;
a = _m [ tile ] . m3 ;
b = _m [ tile ] . m2 ;
b & = a ;
@ -2139,7 +2139,7 @@ static void ClickTile_Track(TileIndex tile)
{
if ( IsTileDepotType ( tile , TRANSPORT_RAIL ) )
ShowTrainDepotWindow ( tile ) ;
else if ( IsRailWaypoint ( _m ap5 [ tile ] ) )
else if ( IsRailWaypoint ( _m [ tile ] . m5 ) )
ShowRenameWaypointWindow ( GetWaypointByTile ( tile ) ) ;
}
@ -2162,13 +2162,13 @@ static void GetTileDesc_Track(TileIndex tile, TileDesc *td)
STR_NULL , STR_NULL
} ;
td - > str = signal_type [ _m ap3_hi [ tile ] & 0x7 ] ;
td - > str = signal_type [ _m [ tile ] . m4 & 0x7 ] ;
break ;
}
case RAIL_TYPE_DEPOT_WAYPOINT :
default :
td - > str = ( ( _m ap5 [ tile ] & RAIL_SUBTYPE_MASK ) = = RAIL_SUBTYPE_DEPOT ) ?
td - > str = ( ( _m [ tile ] . m5 & RAIL_SUBTYPE_MASK ) = = RAIL_SUBTYPE_DEPOT ) ?
STR_1023_RAILROAD_TRAIN_DEPOT : STR_LANDINFO_WAYPOINT ;
break ;
}