changeset 11677:8d40b1680957 draft

(svn r16057) -Fix [FS#2834] (r16037): division by zero when having an order with only one station that has either middle or near end stop location and where the platform is (significantly) longer than the train.
author rubidium <rubidium@openttd.org>
date Mon, 13 Apr 2009 22:27:21 +0000
parents 638b09679c29
children 8c52e8130cfe
files src/station_cmd.cpp src/train_cmd.cpp
diffstat 2 files changed, 12 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/station_cmd.cpp
+++ b/src/station_cmd.cpp
@@ -2681,7 +2681,7 @@
 		 * begin of the platform to the stop location is longer than the length
 		 * of the platform. Station ahead 'includes' the current tile where the
 		 * vehicle is on, so we need to substract that. */
-		if (station_length <= stop + station_ahead - TILE_SIZE) return VETSB_CONTINUE;
+		if (!IsInsideBS(stop + station_ahead, station_length, TILE_SIZE)) return VETSB_CONTINUE;
 
 		DiagDirection dir = DirToDiagDir(v->direction);
 
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -474,15 +474,18 @@
 			/* The distance to go is whatever is still ahead of the train minus the
 			 * distance from the train's stop location to the end of the platform */
 			int distance_to_go = station_ahead / TILE_SIZE - (station_length - stop_at) / TILE_SIZE;
-			int st_max_speed = 120;
-
-			int delta_v = v->cur_speed / (distance_to_go + 1);
-			if (v->max_speed > (v->cur_speed - delta_v)) {
-				st_max_speed = v->cur_speed - (delta_v / 10);
+
+			if (distance_to_go > 0) {
+				int st_max_speed = 120;
+
+				int delta_v = v->cur_speed / (distance_to_go + 1);
+				if (v->max_speed > (v->cur_speed - delta_v)) {
+					st_max_speed = v->cur_speed - (delta_v / 10);
+				}
+
+				st_max_speed = max(st_max_speed, 25 * distance_to_go);
+				max_speed = min(max_speed, st_max_speed);
 			}
-
-			st_max_speed = max(st_max_speed, 25 * distance_to_go);
-			max_speed = min(max_speed, st_max_speed);
 		}
 	}