summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2008-10-24 20:53:57 +0000
committerrubidium <rubidium@openttd.org>2008-10-24 20:53:57 +0000
commit7588513003b83742cbd88a5c95654ceac3427b15 (patch)
treef9dd7084125213f2ca4ff1dff579f39f7c4fa602
parente3e65e8f2beedcb5a1b6069d5986a323d5c11187 (diff)
downloadopenttd-7588513003b83742cbd88a5c95654ceac3427b15.tar.xz
(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.
-rw-r--r--src/station_cmd.cpp11
-rw-r--r--src/train_cmd.cpp2
2 files changed, 5 insertions, 8 deletions
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);