summaryrefslogtreecommitdiff
path: root/src/roadveh_cmd.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-10-04 20:16:35 +0000
committerrubidium <rubidium@openttd.org>2007-10-04 20:16:35 +0000
commit07f8b91a1835936d705cc90b0de209854ffa3b85 (patch)
treec08d1b120c291a10efaa3df08a2e2b67b1946733 /src/roadveh_cmd.cpp
parent791d68325b502208fe1c195739244091af40164b (diff)
downloadopenttd-07f8b91a1835936d705cc90b0de209854ffa3b85.tar.xz
(svn r11200) -Fix [FS#1291]: road vehicles could not overtake on one way roads going to the east.
Diffstat (limited to 'src/roadveh_cmd.cpp')
-rw-r--r--src/roadveh_cmd.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 2273ff524..012747bba 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -998,7 +998,7 @@ struct OvertakeData {
const Vehicle* u;
const Vehicle* v;
TileIndex tile;
- byte tilebits;
+ uint16 tilebits;
};
static void* EnumFindVehToOvertake(Vehicle* v, void* data)
@@ -1014,9 +1014,10 @@ static bool FindRoadVehToOvertake(OvertakeData *od)
{
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 bool FindRoadVehToOvertake(OvertakeData *od)
static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
{
OvertakeData od;
- byte tt;
+ uint16 tt;
od.v = v;
od.u = u;
@@ -1038,6 +1039,9 @@ static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
/* 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 @@ static void RoadVehCheckOvertake(Vehicle *v, Vehicle *u)
/* 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 @@ again:
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;
}
}