Changeset - r1758:5eb360df62a3
[Not reviewed]
master
0 3 0
matthijs - 20 years ago 2005-05-03 20:45:23
matthijs@openttd.org
(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.
3 files changed with 20 insertions and 13 deletions:
0 comments (0 inline, 0 general)
roadveh_cmd.c
Show inline comments
 
@@ -311,13 +311,7 @@ static Depot *FindClosestRoadDepot(Vehic
 
	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);
train_cmd.c
Show inline comments
 
@@ -1298,14 +1298,16 @@ static bool TrainFindDepotEnumProc(uint 
 
	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;
 

	
vehicle.c
Show inline comments
 
@@ -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
 

	
 
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:
0 comments (0 inline, 0 general)