summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatthijs <matthijs@openttd.org>2005-05-03 20:45:23 +0000
committermatthijs <matthijs@openttd.org>2005-05-03 20:45:23 +0000
commitf04ba0b67992c7aa3c0056675bf7f81a00c6d969 (patch)
tree7bc7501d9478e3e45c2b4d8d2bea5cbc5d3deb9c
parentf7eb57c0fcf60e6992ce38ae61533b6c75f13a24 (diff)
downloadopenttd-f04ba0b67992c7aa3c0056675bf7f81a00c6d969.tar.xz
(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.
-rw-r--r--roadveh_cmd.c10
-rw-r--r--train_cmd.c6
-rw-r--r--vehicle.c17
3 files changed, 20 insertions, 13 deletions
diff --git a/roadveh_cmd.c b/roadveh_cmd.c
index 08507023d..64ba65548 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 d9eb5cd29..577257800 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 4cd4b7b3a..0f83dbe83 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: