|
@@ -791,30 +791,23 @@ static void ProcessRoadVehOrder(Vehicle
|
|
|
}
|
|
|
|
|
|
v->current_order = *order;
|
|
|
|
|
|
switch (order->type) {
|
|
|
case OT_GOTO_STATION: {
|
|
|
const RoadStop* rs;
|
|
|
|
|
|
if (order->dest == v->last_station_visited) {
|
|
|
v->last_station_visited = INVALID_STATION;
|
|
|
}
|
|
|
|
|
|
rs = GetStation(order->dest)->GetPrimaryRoadStop(
|
|
|
IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK
|
|
|
);
|
|
|
const RoadStop *rs = GetStation(order->dest)->GetPrimaryRoadStop(v);
|
|
|
|
|
|
TileIndex dest = INVALID_TILE;
|
|
|
if (rs != NULL) {
|
|
|
uint mindist = MAX_UVALUE(uint);
|
|
|
|
|
|
for (; rs != NULL; rs = rs->next) {
|
|
|
/* The vehicle cannot go to this roadstop */
|
|
|
if ((GetRoadTypes(rs->xy) & v->u.road.compatible_roadtypes) == ROADTYPES_NONE) continue;
|
|
|
|
|
|
for (; rs != NULL; rs = rs->GetNextRoadStop(v)) {
|
|
|
uint dist = DistanceManhattan(v->tile, rs->xy);
|
|
|
|
|
|
if (dist < mindist) {
|
|
|
mindist = dist;
|
|
|
dest = rs->xy;
|
|
|
}
|
|
@@ -1151,14 +1144,15 @@ static Trackdir RoadFindPathToDest(Vehic
|
|
|
if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && (!IsTileOwner(tile, v->owner) || GetRoadDepotDirection(tile) == enterdir || (GetRoadTypes(tile) & v->u.road.compatible_roadtypes) == 0)) {
|
|
|
/* Road depot owned by another player or with the wrong orientation */
|
|
|
trackdirs = TRACKDIR_BIT_NONE;
|
|
|
}
|
|
|
} else if (IsTileType(tile, MP_STATION) && IsStandardRoadStopTile(tile)) {
|
|
|
/* Standard road stop (drive-through stops are treated as normal road) */
|
|
|
if (!IsTileOwner(tile, v->owner) || GetRoadStopDir(tile) == enterdir) {
|
|
|
/* different station owner or wrong orientation */
|
|
|
|
|
|
if (!IsTileOwner(tile, v->owner) || GetRoadStopDir(tile) == enterdir || RoadVehHasArticPart(v)) {
|
|
|
/* different station owner or wrong orientation or the vehicle has articulated parts */
|
|
|
trackdirs = TRACKDIR_BIT_NONE;
|
|
|
} else {
|
|
|
/* Our station */
|
|
|
RoadStop::Type rstype = IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK;
|
|
|
|
|
|
if (GetRoadStopType(tile) != rstype) {
|
|
@@ -1920,13 +1914,13 @@ void OnNewDay_RoadVeh(Vehicle *v)
|
|
|
|
|
|
if (v->vehstatus & VS_STOPPED) return;
|
|
|
|
|
|
/* update destination */
|
|
|
if (v->current_order.type == OT_GOTO_STATION && v->u.road.slot == NULL && !(v->vehstatus & VS_CRASHED)) {
|
|
|
Station* st = GetStation(v->current_order.dest);
|
|
|
RoadStop* rs = st->GetPrimaryRoadStop(IsCargoInClass(v->cargo_type, CC_PASSENGERS) ? RoadStop::BUS : RoadStop::TRUCK);
|
|
|
RoadStop *rs = st->GetPrimaryRoadStop(v);
|
|
|
RoadStop* best = NULL;
|
|
|
|
|
|
if (rs != NULL) {
|
|
|
/* We try to obtain a slot if:
|
|
|
* 1) we're reasonably close to the primary road stop
|
|
|
* or
|
|
@@ -1938,13 +1932,13 @@ void OnNewDay_RoadVeh(Vehicle *v)
|
|
|
uint minbadness = UINT_MAX;
|
|
|
|
|
|
DEBUG(ms, 2, "Attempting to obtain a slot for vehicle %d (index %d) at station %d (0x%X)",
|
|
|
v->unitnumber, v->index, st->index, st->xy
|
|
|
);
|
|
|
/* Now we find the nearest road stop that has a free slot */
|
|
|
for (; rs != NULL; rs = rs->next) {
|
|
|
for (; rs != NULL; rs = rs->GetNextRoadStop(v)) {
|
|
|
dist = RoadFindPathToStop(v, rs->xy);
|
|
|
if (dist == UINT_MAX) {
|
|
|
DEBUG(ms, 4, " stop 0x%X is unreachable, not treating further", rs->xy);
|
|
|
continue;
|
|
|
}
|
|
|
badness = (rs->num_vehicles + 1) * (rs->num_vehicles + 1) + dist;
|