src/elrail.cpp
branchcustombridgeheads
changeset 5650 aefc131bf5ce
parent 5649 55c8267c933f
equal deleted inserted replaced
5649:55c8267c933f 5650:aefc131bf5ce
    65 #include "train.h"
    65 #include "train.h"
    66 #include "gui.h"
    66 #include "gui.h"
    67 
    67 
    68 static inline TLG GetTLG(TileIndex t)
    68 static inline TLG GetTLG(TileIndex t)
    69 {
    69 {
    70 	return (HASBIT(TileX(t), 0) << 1) + HASBIT(TileY(t), 0);
    70 	return (TLG)((HASBIT(TileX(t), 0) << 1) + HASBIT(TileY(t), 0));
    71 }
    71 }
    72 
    72 
    73 /** Finds which Rail Bits are present on a given tile. For bridge tiles,
    73 /** Finds which Rail Bits are present on a given tile. For bridge tiles,
    74  * returns track bits under the bridge
    74  * returns track bits under the bridge
    75  */
    75  */
    76 static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
    76 static TrackBits GetRailTrackBitsUniversal(TileIndex t, byte *override)
    77 {
    77 {
    78 	switch (GetTileType(t)) {
    78 	switch (GetTileType(t)) {
    79 		case MP_RAILWAY:
    79 		case MP_RAILWAY:
    80 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0;
    80 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
    81 			switch (GetRailTileType(t)) {
    81 			switch (GetRailTileType(t)) {
    82 				case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
    82 				case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
    83 					return GetTrackBits(t);
    83 					return GetTrackBits(t);
    84 				case RAIL_TILE_DEPOT_WAYPOINT:
    84 				case RAIL_TILE_DEPOT_WAYPOINT:
    85 					if (GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT) return GetRailWaypointBits(t);
    85 					if (GetRailTileSubtype(t) == RAIL_SUBTYPE_WAYPOINT) return GetRailWaypointBits(t);
    86 				default:
    86 				default:
    87 					return 0;
    87 					return TRACK_BIT_NONE;
    88 			}
    88 			}
    89 			break;
    89 			break;
    90 
    90 
    91 		case MP_TUNNEL:
    91 		case MP_TUNNEL:
    92 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0;
    92 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
    93 			if (override != NULL) *override = 1 << GetTunnelDirection(t);
    93 			if (override != NULL) *override = 1 << GetTunnelDirection(t);
    94 			return AxisToTrackBits(DiagDirToAxis(GetTunnelDirection(t)));
    94 			return AxisToTrackBits(DiagDirToAxis(GetTunnelDirection(t)));
    95 
    95 
    96 		case MP_RAILWAY_BRIDGE:
    96 		case MP_RAILWAY_BRIDGE:
    97 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0;
    97 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
    98 			if (override != NULL && DistanceMax(t, GetOtherBridgeEnd(t)) > 1) {
    98 			if (override != NULL && DistanceMax(t, GetOtherBridgeEnd(t)) > 1) {
    99 				*override = 1 << GetBridgeRampDirection(t);
    99 				*override = 1 << GetBridgeRampDirection(t);
   100 			}
   100 			}
   101 			return GetTrackBits(t);
   101 			return GetTrackBits(t);
   102 
   102 
   103 		case MP_STREET:
   103 		case MP_STREET:
   104 			if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return 0;
   104 			if (GetRoadTileType(t) != ROAD_TILE_CROSSING) return TRACK_BIT_NONE;
   105 			if (GetRailTypeCrossing(t) != RAILTYPE_ELECTRIC) return 0;
   105 			if (GetRailTypeCrossing(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
   106 			return GetCrossingRailBits(t);
   106 			return GetCrossingRailBits(t);
   107 
   107 
   108 		case MP_STATION:
   108 		case MP_STATION:
   109 			if (!IsRailwayStation(t)) return 0;
   109 			if (!IsRailwayStation(t)) return TRACK_BIT_NONE;
   110 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return 0;
   110 			if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
   111 			if (!IsStationTileElectrifiable(t)) return 0;
   111 			if (!IsStationTileElectrifiable(t)) return TRACK_BIT_NONE;
   112 			return TrackToTrackBits(GetRailStationTrack(t));
   112 			return TrackToTrackBits(GetRailStationTrack(t));
   113 
   113 
   114 		default:
   114 		default:
   115 			return 0;
   115 			return TRACK_BIT_NONE;
   116 	}
   116 	}
   117 }
   117 }
   118 
   118 
   119 /** Corrects the tileh for certain tile types. Returns an effective tileh for the track on the tile.
   119 /** Corrects the tileh for certain tile types. Returns an effective tileh for the track on the tile.
   120  * @param tile The tile to analyse
   120  * @param tile The tile to analyse
   170 	 * 2) on the "far" end of a bridge head (the one that connects to bridge middle),
   170 	 * 2) on the "far" end of a bridge head (the one that connects to bridge middle),
   171 	 *    because that one is drawn on the bridge. Exception is for length 0 bridges
   171 	 *    because that one is drawn on the bridge. Exception is for length 0 bridges
   172 	 *    which have no middle tiles */
   172 	 *    which have no middle tiles */
   173 	trackconfig[TS_HOME] = GetRailTrackBitsUniversal(ti->tile, &OverridePCP);
   173 	trackconfig[TS_HOME] = GetRailTrackBitsUniversal(ti->tile, &OverridePCP);
   174 	/* If a track bit is present that is not in the main direction, the track is level */
   174 	/* If a track bit is present that is not in the main direction, the track is level */
   175 	isflat[TS_HOME] = trackconfig[TS_HOME] & (TRACK_BIT_HORZ | TRACK_BIT_VERT);
   175 	isflat[TS_HOME] = ((trackconfig[TS_HOME] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
   176 
   176 
   177 	AdjustTileh(ti->tile, &tileh[TS_HOME]);
   177 	AdjustTileh(ti->tile, &tileh[TS_HOME]);
   178 
   178 
   179 	for (i = DIAGDIR_NE; i < DIAGDIR_END; i++) {
   179 	for (i = DIAGDIR_NE; i < DIAGDIR_END; i++) {
   180 		TileIndex neighbour = ti->tile + TileOffsByDiagDir(i);
   180 		TileIndex neighbour = ti->tile + TileOffsByDiagDir(i);
   183 
   183 
   184 		/* Here's one of the main headaches. GetTileSlope does not correct for possibly
   184 		/* Here's one of the main headaches. GetTileSlope does not correct for possibly
   185 		 * existing foundataions, so we do have to do that manually later on.*/
   185 		 * existing foundataions, so we do have to do that manually later on.*/
   186 		tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL);
   186 		tileh[TS_NEIGHBOUR] = GetTileSlope(neighbour, NULL);
   187 		trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL);
   187 		trackconfig[TS_NEIGHBOUR] = GetRailTrackBitsUniversal(neighbour, NULL);
   188 		if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = 0;
   188 		if (IsTunnelTile(neighbour) && i != GetTunnelDirection(neighbour)) trackconfig[TS_NEIGHBOUR] = TRACK_BIT_NONE;
   189 		isflat[TS_NEIGHBOUR] = trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT);
   189 		isflat[TS_NEIGHBOUR] = ((trackconfig[TS_NEIGHBOUR] & (TRACK_BIT_HORZ | TRACK_BIT_VERT)) != 0);
   190 
   190 
   191 		PPPpreferred[i] = 0xFF; /* We start with preferring everything (end-of-line in any direction) */
   191 		PPPpreferred[i] = 0xFF; /* We start with preferring everything (end-of-line in any direction) */
   192 		PPPallowed[i] = AllowedPPPonPCP[i];
   192 		PPPallowed[i] = AllowedPPPonPCP[i];
   193 
   193 
   194 		/* We cycle through all the existing tracks at a PCP and see what
   194 		/* We cycle through all the existing tracks at a PCP and see what
   288 
   288 
   289 		if (height <= TilePixelHeight(ti->tile) + TILE_HEIGHT) return;
   289 		if (height <= TilePixelHeight(ti->tile) + TILE_HEIGHT) return;
   290 	}
   290 	}
   291 
   291 
   292 	/* Drawing of pylons is finished, now draw the wires */
   292 	/* Drawing of pylons is finished, now draw the wires */
   293 	for (t = 0; t < TRACK_END; t++) {
   293 	for (t = TRACK_BEGIN; t < TRACK_END; t++) {
   294 		if (HASBIT(trackconfig[TS_HOME], t)) {
   294 		if (HASBIT(trackconfig[TS_HOME], t)) {
   295 
   295 
   296 			byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) +
   296 			byte PCPconfig = HASBIT(PCPstatus, PCPpositions[t][0]) +
   297 				(HASBIT(PCPstatus, PCPpositions[t][1]) << 1);
   297 				(HASBIT(PCPstatus, PCPpositions[t][1]) << 1);
   298 
   298 
   320 
   320 
   321 	const SortableSpriteStruct *sss;
   321 	const SortableSpriteStruct *sss;
   322 	Axis axis = GetBridgeAxis(ti->tile);
   322 	Axis axis = GetBridgeAxis(ti->tile);
   323 	TLG tlg = GetTLG(ti->tile);
   323 	TLG tlg = GetTLG(ti->tile);
   324 
   324 
   325 	CatenarySprite offset = axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH;
   325 	CatenarySprite offset = (CatenarySprite)(axis == AXIS_X ? 0 : WIRE_Y_FLAT_BOTH - WIRE_X_FLAT_BOTH);
   326 
   326 
   327 	if ((length % 2) && num == length) {
   327 	if ((length % 2) && num == length) {
   328 		/* Draw the "short" wire on the southern end of the bridge
   328 		/* Draw the "short" wire on the southern end of the bridge
   329 		 * only needed if the length of the bridge is odd */
   329 		 * only needed if the length of the bridge is odd */
   330 		sss = &CatenarySpriteData[WIRE_X_FLAT_BOTH + offset];
   330 		sss = &CatenarySpriteData[WIRE_X_FLAT_BOTH + offset];