(svn r14526) -Fix [FS#2379]: make sure trains stop at the end of a station; a 3/8th length train did stop 2/8th of it's length too early causing a 63/8th long train not to fit in a 4 tile station.
authorrubidium
Fri, 24 Oct 2008 20:53:57 +0000
changeset 10287 e84ee4b8ba7b
parent 10286 2b7a578f3bb4
child 10288 9c6717bac8a1
(svn r14526) -Fix [FS#2379]: make sure trains stop at the end of a station; a 3/8th length train did stop 2/8th of it's length too early causing a 63/8th long train not to fit in a 4 tile station.
src/station_cmd.cpp
src/train_cmd.cpp
--- a/src/station_cmd.cpp	Fri Oct 24 17:44:49 2008 +0000
+++ b/src/station_cmd.cpp	Fri Oct 24 20:53:57 2008 +0000
@@ -2548,10 +2548,6 @@
 	}
 }
 
-static const byte _enter_station_speedtable[12] = {
-	215, 195, 175, 155, 135, 115, 95, 75, 55, 35, 15, 0
-};
-
 static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, int x, int y)
 {
 	StationID station_id = GetStationIndex(tile);
@@ -2568,12 +2564,13 @@
 			if (DiagDirToAxis(dir) != AXIS_X) Swap(x, y);
 			if (y == TILE_SIZE / 2) {
 				if (dir != DIAGDIR_SE && dir != DIAGDIR_SW) x = TILE_SIZE - 1 - x;
-				if (x == 12) return VETSB_ENTERED_STATION | (VehicleEnterTileStatus)(station_id << VETS_STATION_ID_OFFSET); /* enter station */
-				if (x < 12) {
+				int stop = TILE_SIZE - (v->u.rail.cached_veh_length + 1) / 2;
+				if (x == stop) return VETSB_ENTERED_STATION | (VehicleEnterTileStatus)(station_id << VETS_STATION_ID_OFFSET); /* enter station */
+				if (x < stop) {
 					uint16 spd;
 
 					v->vehstatus |= VS_TRAIN_SLOWING;
-					spd = _enter_station_speedtable[x];
+					spd = max(0, (stop - x) * 20 - 15);
 					if (spd < v->cur_speed) v->cur_speed = spd;
 				}
 			}
--- a/src/train_cmd.cpp	Fri Oct 24 17:44:49 2008 +0000
+++ b/src/train_cmd.cpp	Fri Oct 24 20:53:57 2008 +0000
@@ -4104,7 +4104,7 @@
 	}
 
 	/* do not reverse when approaching red signal */
-	if (!signal && x + 4 >= TILE_SIZE) {
+	if (!signal && x + (v->u.rail.cached_veh_length + 1) / 2 >= TILE_SIZE) {
 		/* we are too near the tile end, reverse now */
 		v->cur_speed = 0;
 		ReverseTrainDirection(v);