From 0699c54c455970a228d6ba2a93b8ea7eaf941c2b Mon Sep 17 00:00:00 2001 From: matthijs Date: Tue, 3 May 2005 20:45:23 +0000 Subject: [PATCH] (svn r2262) - Fix: Assertion when vehicle in a depot wants to do pathfinding. GetVehicleTrackdir now tries to get a valid trackdir as much as possibly, by assuming that a vehicle is facing outwards in a depot or road station, for example. - Codechange: [Multistop] Multistop now also tries to find a slot for road vehicles that are in stations, since the pathfinder now properly handles that. --- roadveh_cmd.c | 10 ++-------- train_cmd.c | 6 ++++-- vehicle.c | 17 ++++++++++++++--- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/roadveh_cmd.c b/roadveh_cmd.c index 08507023d1..64ba655483 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -311,13 +311,7 @@ static Depot *FindClosestRoadDepot(Vehicle *v) if (_patches.new_pathfinding_all) { NPFFoundTargetData ftd; /* See where we are now */ - byte trackdir; - if (IsRoadStationTile(tile)) - /* if we are in a station, simulate leaving the station (since - * v->direction won't contain anything usefule than */ - trackdir = _dir_to_diag_trackdir[GetRoadStationDir(tile)]; - else - trackdir = GetVehicleTrackdir(v); + byte trackdir = GetVehicleTrackdir(v); ftd = NPFRouteToDepotBreadthFirst(v->tile, trackdir, TRANSPORT_ROAD, v->owner); if (ftd.best_bird_dist == 0) @@ -1665,7 +1659,7 @@ void OnNewDay_RoadVeh(Vehicle *v) } //We do not have a slot, so make one - if (v->u.road.slot == NULL && rs != NULL && IsTileType(v->tile, MP_STREET)) { + if (v->u.road.slot == NULL && rs != NULL) { //first we need to find out how far our stations are away. DEBUG(ms, 2) ("Multistop: Attempting to obtain a slot for vehicle %d at station %d (0x%x)", v->unitnumber, st->index, st->xy); diff --git a/train_cmd.c b/train_cmd.c index d9eb5cd298..577257800f 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -1298,14 +1298,16 @@ static bool TrainFindDepotEnumProc(uint tile, TrainFindDepotData *tfdd, int trac return length >= tfdd->best_length; } -// returns the tile of a depot to goto to. The given vehicle must be on track, -// so not crashed, in a depot, etc. +// returns the tile of a depot to goto to. The given vehicle must not be +// crashed! static TrainFindDepotData FindClosestTrainDepot(Vehicle *v) { int i; TrainFindDepotData tfdd; uint tile = v->tile; + assert(!(v->vehstatus & VS_CRASHED)); + tfdd.owner = v->owner; tfdd.best_length = (uint)-1; diff --git a/vehicle.c b/vehicle.c index 4cd4b7b3af..0f83dbe833 100644 --- a/vehicle.c +++ b/vehicle.c @@ -17,6 +17,8 @@ #include "debug.h" #include "npf.h" #include "vehicle_gui.h" +#include "depot.h" +#include "station.h" #define INVALID_COORD (-0x8000) #define GEN_HASH(x,y) (((x & 0x1F80)>>7) + ((y & 0xFC0))) @@ -1714,11 +1716,15 @@ byte GetDirectionTowards(Vehicle *v, int x, int y) byte GetVehicleTrackdir(const Vehicle* v) { + if (v->vehstatus & VS_CRASHED) + return 0xff; + switch(v->type) { case VEH_Train: if (v->u.rail.track == 0x80) - return 0xFF; /* Train in depot */ + /* We'll assume the train is facing outwards */ + return _dir_to_diag_trackdir[GetDepotDirection(v->tile, TRANSPORT_RAIL)]; /* Train in depot */ else if (v->u.rail.track == 0x40) /* train in tunnel, so just use his direction and assume a diagonal track */ return _dir_to_diag_trackdir[(v->direction>>1)&3]; @@ -1726,12 +1732,17 @@ byte GetVehicleTrackdir(const Vehicle* v) return _track_direction_to_trackdir[FIND_FIRST_BIT(v->u.rail.track)][v->direction]; case VEH_Ship: if (v->u.ship.state == 0x80) - return 0xFF; /* Ship in depot */ + /* We'll assume the ship is facing outwards */ + return _dir_to_diag_trackdir[GetDepotDirection(v->tile, TRANSPORT_WATER)]; /* Ship in depot */ else return _track_direction_to_trackdir[FIND_FIRST_BIT(v->u.ship.state)][v->direction]; case VEH_Road: if (v->u.road.state == 254) - return 0xFF; /* Road vehicle in depot */ + /* We'll assume the road vehicle is facing outwards */ + return _dir_to_diag_trackdir[GetDepotDirection(v->tile, TRANSPORT_ROAD)]; /* Road vehicle in depot */ + else if (IsRoadStationTile(v->tile)) + /* We'll assume the road vehicle is facing outwards */ + return _dir_to_diag_trackdir[GetRoadStationDir(v->tile)]; /* Road vehicle in a station */ else return _dir_to_diag_trackdir[(v->direction>>1)&3]; case VEH_Aircraft: