(svn r2256) - Fix: Trains cannot find a depot when they are in a tunnel. (glx)
authormatthijs
Mon, 02 May 2005 23:59:11 +0000
changeset 1752 cdbfb2f23e72
parent 1751 954dd2900ac9
child 1753 091f7a870a2a
(svn r2256) - Fix: Trains cannot find a depot when they are in a tunnel. (glx)
- Add: GetVehicleTrackdir() helper function.
- Codechange: Moved SortStruct from vehicle_gui.h to ttd.h, so the dependency from vehicle.h on vehicle_gui.h could be removed.
- Codechange: Typedeffed the VehicleTypes struct so it can be used as the type for Vehicle.type instead of "byte".
- Codechange: Removed prototype for VehicleSorter(), which had no implementation anymore and was never called.
aircraft_cmd.c
misc.c
network_server.c
order_cmd.c
order_gui.c
roadveh_cmd.c
ship_cmd.c
train_cmd.c
ttd.h
vehicle.c
vehicle.h
vehicle_gui.c
vehicle_gui.h
water_cmd.c
--- a/aircraft_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/aircraft_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -13,6 +13,7 @@
 #include "sound.h"
 #include "player.h"
 #include "airport.h"
+#include "vehicle_gui.h"
 
 static bool AirportMove(Vehicle *v, const AirportFTAClass *Airport);
 static bool AirportSetBlocks(Vehicle *v, AirportFTA *current_pos, const AirportFTAClass *Airport);
--- a/misc.c	Mon May 02 22:13:20 2005 +0000
+++ b/misc.c	Mon May 02 23:59:11 2005 +0000
@@ -12,6 +12,7 @@
 #include "network_data.h"
 #include "network_server.h"
 #include "engine.h"
+#include "vehicle_gui.h"
 
 extern void StartupEconomy(void);
 extern void InitNewsItemStructs(void);
--- a/network_server.c	Mon May 02 22:13:20 2005 +0000
+++ b/network_server.c	Mon May 02 23:59:11 2005 +0000
@@ -1291,6 +1291,9 @@
 				case VEH_Ship:
 					_network_player_info[v->owner].num_vehicle[4]++;
 					break;
+				case VEH_Special:
+				case VEH_Disaster:
+					break;
 			}
 	}
 
--- a/order_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/order_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -10,6 +10,7 @@
 #include "player.h"
 #include "news.h"
 #include "saveload.h"
+#include "vehicle_gui.h"
 
 enum {
 	/* Max orders: 64000 (64 * 1000) */
--- a/order_gui.c	Mon May 02 22:13:20 2005 +0000
+++ b/order_gui.c	Mon May 02 23:59:11 2005 +0000
@@ -118,6 +118,8 @@
 						case VEH_Train: s = STR_880E_GO_TO_TRAIN_DEPOT;   break;
 						case VEH_Road:  s = STR_9038_GO_TO_ROADVEH_DEPOT; break;
 						case VEH_Ship:  s = STR_GO_TO_SHIP_DEPOT;         break;
+						default:
+						break;
 					}
 				}
 				if (v->type == VEH_Train && order->flags & OF_NON_STOP)
--- a/roadveh_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/roadveh_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -15,6 +15,7 @@
 #include "player.h"
 #include "sound.h"
 #include "depot.h"
+#include "vehicle_gui.h"
 
 void ShowRoadVehViewWindow(Vehicle *v);
 
@@ -316,7 +317,7 @@
 			 * v->direction won't contain anything usefule than */
 			trackdir = _dir_to_diag_trackdir[GetRoadStationDir(tile)];
 		else
-			trackdir = _dir_to_diag_trackdir[(v->direction>>1)&3];
+			trackdir = GetVehicleTrackdir(v);
 
 		ftd = NPFRouteToDepotBreadthFirst(v->tile, trackdir, TRANSPORT_ROAD, v->owner);
 		if (ftd.best_bird_dist == 0)
@@ -1160,7 +1161,8 @@
 static uint RoadFindPathToStation(const Vehicle *v, TileIndex tile)
 {
   NPFFindStationOrTileData fstd;
-  byte trackdir = _dir_to_diag_trackdir[(v->direction >> 1) & 3];
+  byte trackdir = GetVehicleTrackdir(v);
+	assert(trackdir != 0xFF);
 
   fstd.dest_coords = tile;
   fstd.station_index = -1;	// indicates that the destination is a tile, not a station
--- a/ship_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/ship_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -73,7 +73,7 @@
 
 	if (_patches.new_pathfinding_all) {
 		NPFFoundTargetData ftd;
-		byte trackdir = _track_direction_to_trackdir[FIND_FIRST_BIT(v->u.ship.state)][v->direction];
+		byte trackdir = GetVehicleTrackdir(v);
 		ftd = NPFRouteToDepotTrialError(v->tile, trackdir, TRANSPORT_WATER, v->owner);
 		if (ftd.best_bird_dist == 0)
 			best_depot = GetDepotByTile(ftd.node.tile); /* Found target */
@@ -567,14 +567,12 @@
 		NPFFindStationOrTileData fstd;
 		NPFFoundTargetData ftd;
 		uint src_tile = TILE_ADD(tile, TileOffsByDir(_reverse_dir[enterdir]));
-		byte track = FIND_FIRST_BIT(v->u.ship.state);
-		assert (KILL_FIRST_BIT(v->u.ship.state) == 0); /* Check that only one bit is set in state */
-		assert (v->u.ship.state != 0x80); /* Check that we are not in a depot */
-		assert (track < 6);
+		byte trackdir = GetVehicleTrackdir(v);
+		assert (trackdir != 0xFF); /* Check that we are not in a depot */
 
 		NPFFillWithOrderData(&fstd, v);
 
-		ftd = NPFRouteToStationOrTile(src_tile, _track_direction_to_trackdir[track][v->direction], &fstd, TRANSPORT_WATER, v->owner);
+		ftd = NPFRouteToStationOrTile(src_tile, trackdir, &fstd, TRANSPORT_WATER, v->owner);
 
 		if (ftd.best_trackdir != 0xff)
 			/* If ftd.best_bird_dist is 0, we found our target and ftd.best_trackdir contains
--- a/train_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/train_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -16,6 +16,7 @@
 #include "sound.h"
 #include "depot.h"
 #include "waypoint.h"
+#include "vehicle_gui.h"
 
 #define is_firsthead_sprite(spritenum) \
 	(is_custom_sprite(spritenum) \
@@ -1317,7 +1318,8 @@
 
 	if (_patches.new_pathfinding_all) {
 		NPFFoundTargetData ftd;
-		byte trackdir = _track_direction_to_trackdir[FIND_FIRST_BIT(v->u.rail.track)][v->direction];
+		byte trackdir = GetVehicleTrackdir(v);
+		assert (trackdir != 0xFF);
 		ftd = NPFRouteToDepotBreadthFirst(v->tile, trackdir, TRANSPORT_RAIL, v->owner);
 		if (ftd.best_bird_dist == 0) {
 			/* Found target */
@@ -1668,7 +1670,7 @@
 
 		NPFFillWithOrderData(&fstd, v);
 		/* The enterdir for the new tile, is the exitdir for the old tile */
-		trackdir = _track_exitdir_to_trackdir[FIND_FIRST_BIT(v->u.rail.track)][enterdir];
+		trackdir = GetVehicleTrackdir(v);
 		assert(trackdir != 0xff);
 
 		ftd = NPFRouteToStationOrTile(tile - TileOffsByDir(enterdir), trackdir, &fstd, TRANSPORT_RAIL, v->owner);
@@ -1804,8 +1806,8 @@
 
 		NPFFillWithOrderData(&fstd, v);
 
-		trackdir = _track_direction_to_trackdir[FIND_FIRST_BIT(v->u.rail.track)][v->direction];
-		trackdir_rev = REVERSE_TRACKDIR(_track_direction_to_trackdir[FIND_FIRST_BIT(last->u.rail.track)][last->direction]);
+		trackdir = GetVehicleTrackdir(v);
+		trackdir_rev = REVERSE_TRACKDIR(GetVehicleTrackdir(v));
 		assert(trackdir != 0xff);
 		assert(trackdir_rev != 0xff);
 
--- a/ttd.h	Mon May 02 22:13:20 2005 +0000
+++ b/ttd.h	Mon May 02 23:59:11 2005 +0000
@@ -25,6 +25,15 @@
 	int b;
 } Pair;
 
+/**
+ * Is used as a general sortable struct (using qsort and friends). Is used for
+ * sorting vehicles and stations at the moment
+ */
+typedef struct SortStruct {
+	uint32	index;
+	byte		owner;
+} SortStruct;
+
 typedef struct YearMonthDay {
 	int year, month, day;
 } YearMonthDay;
--- a/vehicle.c	Mon May 02 22:13:20 2005 +0000
+++ b/vehicle.c	Mon May 02 23:59:11 2005 +0000
@@ -15,6 +15,8 @@
 #include "engine.h"
 #include "sound.h"
 #include "debug.h"
+#include "npf.h"
+#include "vehicle_gui.h"
 
 #define INVALID_COORD (-0x8000)
 #define GEN_HASH(x,y) (((x & 0x1F80)>>7) + ((y & 0xFC0)))
@@ -1707,6 +1709,35 @@
 	return (dir+((dirdiff&7)<5?1:-1)) & 7;
 }
 
+byte GetVehicleTrackdir(const Vehicle* v)
+{
+	switch(v->type)
+	{
+		case VEH_Train:
+			if (v->u.rail.track == 0x80)
+				return 0xFF; /* 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];
+			else
+				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 */
+			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 */
+			else
+				return _dir_to_diag_trackdir[(v->direction>>1)&3];
+		case VEH_Aircraft:
+		case VEH_Special:
+		case VEH_Disaster:
+		default:
+			return 0xFF;
+	}
+}
 /* Return value has bit 0x2 set, when the vehicle enters a station. Then,
  * result << 8 contains the id of the station entered. If the return value has
  * bit 0x8 set, the vehicle could not and did not enter the tile. Are there
@@ -2076,5 +2107,3 @@
 const ChunkHandler _veh_chunk_handlers[] = {
 	{ 'VEHS', Save_VEHS, Load_VEHS, CH_SPARSE_ARRAY | CH_LAST},
 };
-
-
--- a/vehicle.h	Mon May 02 22:13:20 2005 +0000
+++ b/vehicle.h	Mon May 02 23:59:11 2005 +0000
@@ -2,9 +2,49 @@
 #define VEHICLE_H
 
 #include "pool.h"
-#include "vehicle_gui.h"
 #include "order.h"
 
+typedef enum VehicleTypes{
+	VEH_Train = 0x10,
+	VEH_Road = 0x11,
+	VEH_Ship = 0x12,
+	VEH_Aircraft = 0x13,
+	VEH_Special = 0x14,
+	VEH_Disaster = 0x15,
+} VehicleType;
+
+enum VehStatus {
+	VS_HIDDEN = 1,
+	VS_STOPPED = 2,
+	VS_UNCLICKABLE = 4,
+	VS_DEFPAL = 0x8,
+	VS_TRAIN_SLOWING = 0x10,
+	VS_DISASTER = 0x20,
+	VS_AIRCRAFT_BROKEN = 0x40,
+	VS_CRASHED = 0x80,
+};
+
+// 1 and 3 do not appear to be used
+typedef enum TrainSubtypes {
+	TS_Front_Engine = 0,
+	TS_Not_First = 2,
+	TS_Free_Car = 4,
+} TrainSubtype;
+
+/* Effect vehicle types */
+typedef enum EffectVehicle {
+	EV_CHIMNEY_SMOKE   = 0,
+	EV_STEAM_SMOKE     = 1,
+	EV_DIESEL_SMOKE    = 2,
+	EV_ELECTRIC_SPARK  = 3,
+	EV_SMOKE           = 4,
+	EV_EXPLOSION_LARGE = 5,
+	EV_BREAKDOWN_SMOKE = 6,
+	EV_EXPLOSION_SMALL = 7,
+	EV_BULLDOZER       = 8,
+	EV_BUBBLE          = 9
+} EffectVehicle;
+
 typedef struct VehicleRail {
 	uint16 last_speed;		// NOSAVE: only used in UI
 	uint16 crash_anim_pos;
@@ -91,8 +131,8 @@
 };
 
 struct Vehicle {
-	byte type;				// type, ie roadven,train,ship,aircraft,special
-	byte subtype;			// subtype (for trains, 0 == loco, 4 wagon ??)
+	VehicleType type;	// type, ie roadven,train,ship,aircraft,special
+	byte subtype;     // subtype (Filled with values from EffectVehicles or TrainSubTypes)(Filled with values from EffectVehicles or TrainSubTypes)
 
 	uint16 index;			// NOSAVE: Index in vehicle array
 
@@ -199,47 +239,6 @@
 #define is_custom_firsthead_sprite(x) (x == 0xfd)
 #define is_custom_secondhead_sprite(x) (x == 0xfe)
 
-enum {
-	VEH_Train = 0x10,
-	VEH_Road = 0x11,
-	VEH_Ship = 0x12,
-	VEH_Aircraft = 0x13,
-	VEH_Special = 0x14,
-	VEH_Disaster = 0x15,
-};
-
-enum VehStatus {
-	VS_HIDDEN = 1,
-	VS_STOPPED = 2,
-	VS_UNCLICKABLE = 4,
-	VS_DEFPAL = 0x8,
-	VS_TRAIN_SLOWING = 0x10,
-	VS_DISASTER = 0x20,
-	VS_AIRCRAFT_BROKEN = 0x40,
-	VS_CRASHED = 0x80,
-};
-
-// 1 and 3 do not appear to be used
-enum TrainSubtype {
-	TS_Front_Engine = 0,
-	TS_Not_First = 2,
-	TS_Free_Car = 4,
-};
-
-/* Effect vehicle types */
-typedef enum EffectVehicle {
-	EV_CHIMNEY_SMOKE   = 0,
-	EV_STEAM_SMOKE     = 1,
-	EV_DIESEL_SMOKE    = 2,
-	EV_ELECTRIC_SPARK  = 3,
-	EV_SMOKE           = 4,
-	EV_EXPLOSION_LARGE = 5,
-	EV_BREAKDOWN_SMOKE = 6,
-	EV_EXPLOSION_SMALL = 7,
-	EV_BULLDOZER       = 8,
-	EV_BUBBLE          = 9
-} EffectVehicle;
-
 typedef void VehicleTickProc(Vehicle *v);
 typedef void *VehicleFromPosProc(Vehicle *v, void *data);
 
@@ -320,6 +319,19 @@
 	uint new_tile;
 } GetNewVehiclePosResult;
 
+/**
+ * Returns the Trackdir on which the vehicle is currently located.
+ * Works for trains and ships.
+ * Currently works only sortof for road vehicles, since they have a fuzzy
+ * concept of being "on" a trackdir. Dunno really what it returns for a road
+ * vehicle that is halfway a tile, never really understood that part. For road
+ * vehicles that are at the beginning or end of the tile, should just return
+ * the diagonal trackdir on which they are driving. I _think_.
+ * For other vehicles types, or vehicles with no clear trackdir (such as those
+ * in depots), returns 0xFF.
+ */
+byte GetVehicleTrackdir(const Vehicle* v);
+
 /* returns true if staying in the same tile */
 bool GetNewVehiclePos(Vehicle *v, GetNewVehiclePosResult *gp);
 byte GetDirectionTowards(Vehicle *v, int x, int y);
--- a/vehicle_gui.c	Mon May 02 22:13:20 2005 +0000
+++ b/vehicle_gui.c	Mon May 02 23:59:11 2005 +0000
@@ -73,7 +73,7 @@
 		}
 }
 
-void BuildVehicleList(vehiclelist_d *vl, int type, int owner, int station)
+void BuildVehicleList(vehiclelist_d *vl, VehicleType type, int owner, int station)
 {
 	int subtype = (type != VEH_Aircraft) ? TS_Front_Engine : 2;
 	int n = 0;
--- a/vehicle_gui.h	Mon May 02 22:13:20 2005 +0000
+++ b/vehicle_gui.h	Mon May 02 23:59:11 2005 +0000
@@ -1,6 +1,8 @@
 #ifndef VEHICLE_GUI_H
 #define VEHICLE_GUI_H
 
+#include "vehicle.h"
+
 struct vehiclelist_d;
 
 void DrawVehicleProfitButton(Vehicle *v, int x, int y);
@@ -10,16 +12,10 @@
 void RebuildVehicleLists(void);
 void ResortVehicleLists(void);
 
-void BuildVehicleList(struct vehiclelist_d *vl, int type, int owner, int station);
+void BuildVehicleList(struct vehiclelist_d *vl, VehicleType type, int owner, int station);
 void SortVehicleList(struct vehiclelist_d *vl);
 
-typedef struct SortStruct { // store owner through sorting process
-	uint32	index;
-	byte		owner;
-} SortStruct;
-
 int CDECL GeneralOwnerSorter(const void *a, const void *b);
-void VehicleSorter(SortStruct *firstelement, uint32 n, uint16 size);
 VARDEF uint32	_internal_name_sorter_id;	// internal StringID for default vehicle-names
 VARDEF uint32	_last_vehicle_idx;				// cached index to hopefully speed up name-sorting
 VARDEF bool		_internal_sort_order;			// descending/ascending
--- a/water_cmd.c	Mon May 02 22:13:20 2005 +0000
+++ b/water_cmd.c	Mon May 02 23:59:11 2005 +0000
@@ -11,6 +11,7 @@
 #include "news.h"
 #include "sound.h"
 #include "depot.h"
+#include "vehicle_gui.h"
 
 static void FloodVehicle(Vehicle *v);