(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:
tron 2005-04-12 10:31:26 +00:00
parent beb185248b
commit 53d30138b2
3 changed files with 11 additions and 2 deletions

View File

@ -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);
}

View File

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

View File

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