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))