diff options
author | rubidium <rubidium@openttd.org> | 2009-04-13 22:27:21 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-04-13 22:27:21 +0000 |
commit | 34cc30e7fb7060185a92d15f9d68136ba64a8efd (patch) | |
tree | a77a3ec5e295724d4cc38034c6360576f85876e6 | |
parent | 627c042df10f8a7cc8169683713881cff248c1a5 (diff) | |
download | openttd-34cc30e7fb7060185a92d15f9d68136ba64a8efd.tar.xz |
(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.
-rw-r--r-- | src/station_cmd.cpp | 2 | ||||
-rw-r--r-- | src/train_cmd.cpp | 17 |
2 files changed, 11 insertions, 8 deletions
diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 563c440a9..91a7c73f0 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2681,7 +2681,7 @@ static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, i * 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); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 484d0c5c1..87d716627 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -474,15 +474,18 @@ static int GetTrainAcceleration(Vehicle *v, bool mode) /* 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); + } } } |