mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(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
This commit is contained in:
parent
277d9d237b
commit
02f5818912
@ -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);
|
||||
}
|
||||
|
@ -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) ||
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user