changeset 7669:af0275bc24b4 draft

(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
author rubidium <rubidium@openttd.org>
date Thu, 04 Oct 2007 20:16:35 +0000
parents 38e0a757d4d1
children 4c4e4ee36dc8
files src/roadveh_cmd.cpp
diffstat 1 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -998,7 +998,7 @@
 	const Vehicle* u;
 	const Vehicle* v;
 	TileIndex tile;
-	byte tilebits;
+	uint16 tilebits;
 };
 
 static void* EnumFindVehToOvertake(Vehicle* v, void* data)
@@ -1014,9 +1014,10 @@
 {
 	uint32 bits;
 
-	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes) & 0x3F;
+	bits = GetTileTrackStatus(od->tile, TRANSPORT_ROAD, od->v->u.road.compatible_roadtypes);
+	bits |= bits >> 8;
 
-	if (!(od->tilebits & bits) || (bits & 0x3C) || (bits & 0x3F3F0000))
+	if (!(od->tilebits & bits) || (bits & 0x3C3C) || (bits & 0x3F3F0000))
 		return true;
 	return VehicleFromPos(od->tile, od, EnumFindVehToOvertake) != NULL;
 }
@@ -1024,7 +1025,7 @@
 static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
 {
 	OvertakeData od;
-	byte tt;
+	uint16 tt;
 
 	od.v = v;
 	od.u = u;
@@ -1038,6 +1039,9 @@
 	/* Trams can't overtake other trams */
 	if (v->u.road.roadtype == ROADTYPE_TRAM) return;
 
+	/* Don't overtake in stations */
+	if (IsTileType(v->tile, MP_STATION)) return;
+
 	/* For now, articulated road vehicles can't overtake anything. */
 	if (RoadVehHasArticPart(v)) return;
 
@@ -1046,7 +1050,10 @@
 	/* Check if vehicle is in a road stop, depot, tunnel or bridge or not on a straight road */
 	if (v->u.road.state >= RVSB_IN_ROAD_STOP || !IsStraightRoadTrackdir((Trackdir)(v->u.road.state & RVSB_TRACKDIR_MASK))) return;
 
-	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes) & 0x3F;
+	tt = GetTileTrackStatus(v->tile, TRANSPORT_ROAD, v->u.road.compatible_roadtypes);
+	tt |= tt >> 8;
+	tt &= 0x3F;
+
 	if ((tt & 3) == 0) return;
 	if ((tt & 0x3C) != 0) return;
 
@@ -1647,9 +1654,9 @@
 		Vehicle* u = RoadVehFindCloseTo(v, x, y, new_dir);
 
 		if (u != NULL) {
-			v->cur_speed = u->cur_speed;
 			/* There is a vehicle in front overtake it if possible */
 			if (v->u.road.overtaking == 0) RoadVehCheckOvertake(v, u);
+			if (v->u.road.overtaking == 0) v->cur_speed = u->cur_speed;
 			return false;
 		}
 	}