From 7588513003b83742cbd88a5c95654ceac3427b15 Mon Sep 17 00:00:00 2001 From: rubidium Date: Fri, 24 Oct 2008 20:53:57 +0000 Subject: (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 | 11 ++++------- src/train_cmd.cpp | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 283a9d42a..5bd1feb21 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -2548,10 +2548,6 @@ static void ClickTile_Station(TileIndex tile) } } -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 @@ static VehicleEnterTileStatus VehicleEnter_Station(Vehicle *v, TileIndex tile, i 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; } } diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 527b35019..67245fe26 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -4104,7 +4104,7 @@ static bool TrainApproachingLineEnd(Vehicle *v, bool signal) } /* 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); -- cgit v1.2.3-54-g00ecf