From 53d30138b2f852e0785226b1aed4c5551bb896eb Mon Sep 17 00:00:00 2001 From: tron Date: Tue, 12 Apr 2005 10:31:26 +0000 Subject: [PATCH] (svn r2189) Introduce and use IsCompatibleTrainStationTile() This should prevent trains, which are longer than the station, to turn around without stopping under certain circumstances and fix speed limit for trains entering a station, when realistic accerlation is used --- station.h | 9 +++++++++ station_cmd.c | 2 +- train_cmd.c | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/station.h b/station.h index f76eda2275..2ac2e54039 100644 --- a/station.h +++ b/station.h @@ -276,6 +276,15 @@ static inline bool IsTrainStationTile(uint tile) { return IsTileType(tile, MP_STATION) && IS_BYTE_INSIDE(_map5[tile], 0, 8); } +static inline bool IsCompatibleTrainStationTile(TileIndex tile, TileIndex ref) +{ + assert(IsTrainStationTile(ref)); + return + IsTrainStationTile(tile) && + (_map3_lo[tile] & 0x0F) == (_map3_lo[ref] & 0x0F) && // same rail type? + (_map5[tile] & 0x01) == (_map5[ref] & 0x01); // same direction? +} + static inline bool IsRoadStationTile(uint tile) { return IsTileType(tile, MP_STATION) && IS_BYTE_INSIDE(_map5[tile], 0x43, 0x4B); } diff --git a/station_cmd.c b/station_cmd.c index e6f65385c2..aac4b928a8 100644 --- a/station_cmd.c +++ b/station_cmd.c @@ -2322,7 +2322,7 @@ static uint32 VehicleEnter_Station(Vehicle *v, uint tile, int x, int y) if (v->type == VEH_Train) { if (IS_BYTE_INSIDE(_map5[tile], 0, 8) && v->subtype == TS_Front_Engine && - !IsTrainStationTile(tile + TileOffsByDir(v->direction >> 1))) { + !IsCompatibleTrainStationTile(tile + TileOffsByDir(v->direction >> 1), tile)) { station_id = _map2[tile]; if ((!(v->current_order.flags & OF_NON_STOP) && !_patches.new_nonstop) || diff --git a/train_cmd.c b/train_cmd.c index c2aa26eaa8..b10090732e 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -154,7 +154,7 @@ static int GetTrainAcceleration(Vehicle *v, bool mode) do { station_length++; tile = TILE_ADD(tile, TileOffsByDir(v->direction / 2)); - } while (IsTrainStationTile(tile) && (_map5[tile] & 1) == (_map5[v->tile] & 1)); + } while (IsCompatibleTrainStationTile(tile, v->tile)); delta_v = v->cur_speed / (station_length + 1); if (v->max_speed > (v->cur_speed - delta_v))