train_cmd.c
changeset 1432 9086ccebb3f1
parent 1431 93ab62952062
child 1434 f219d7bf2eb6
--- a/train_cmd.c	Sun Mar 06 12:33:33 2005 +0000
+++ b/train_cmd.c	Sun Mar 06 12:41:18 2005 +0000
@@ -2368,16 +2368,23 @@
 	SndPlayVehicleFx(SND_13_BIG_CRASH, v);
 }
 
+typedef struct VehicleAtSignalData {
+	TileIndex tile;
+	byte direction;
+} VehicleAtSignalData;
+
 static void *CheckVehicleAtSignal(Vehicle *v, void *data)
 {
-	uint32 d = (uint32)data;
-
-	if (v->type == VEH_Train && v->subtype == TS_Front_Engine && v->tile == (TileIndex)(d >> 8)) {
-		byte diff = (v->direction - (byte)d + 2) & 7;
+	const VehicleAtSignalData* vasd = data;
+
+	if (v->type == VEH_Train && v->subtype == TS_Front_Engine &&
+			v->tile == vasd->tile) {
+		byte diff = (v->direction - vasd->direction + 2) & 7;
+
 		if (diff == 2 || (v->cur_speed <= 5 && diff <= 4))
-			return (void*)1;
+			return v;
 	}
-	return 0;
+	return NULL;
 }
 
 static void TrainController(Vehicle *v)
@@ -2581,9 +2588,14 @@
 			v->subspeed = 0;
 			v->progress = 255-10;
 			if (++v->load_unload_time_rem < _patches.wait_twoway_signal * 73) {
-				uint o_tile = gp.new_tile + TileOffsByDir(enterdir);
+				TileIndex o_tile = gp.new_tile + TileOffsByDir(enterdir);
+				VehicleAtSignalData vasd = {
+					o_tile,
+					dir ^ 4
+				};
+
 				/* check if a train is waiting on the other side */
-				if (VehicleFromPos(o_tile, (void*)( (o_tile<<8) | (dir^4)), (VehicleFromPosProc*)CheckVehicleAtSignal) == NULL)
+				if (VehicleFromPos(o_tile, &vasd, CheckVehicleAtSignal) == NULL)
 					return;
 			}
 		}