diff --git a/station.h b/station.h index f6907a5705..dd59b1ba96 100644 --- a/station.h +++ b/station.h @@ -200,6 +200,7 @@ void AfterLoadStations(void); void GetProductionAroundTiles(AcceptedCargo produced, TileIndex tile, int w, int h, int rad); void GetAcceptanceAroundTiles(AcceptedCargo accepts, TileIndex tile, int w, int h, int rad); uint GetStationPlatforms(const Station *st, TileIndex tile); +uint GetPlatformLength(TileIndex tile, DiagDirection dir); const DrawTileSprites *GetStationTileLayout(byte gfx); diff --git a/station_cmd.c b/station_cmd.c index 00254dd07f..0339ec0a61 100644 --- a/station_cmd.c +++ b/station_cmd.c @@ -1255,6 +1255,28 @@ uint GetStationPlatforms(const Station *st, TileIndex tile) return len - 1; } +/** Determines the REMAINING length of a platform, starting at (and including) + * the given tile. + * @param tile the tile from which to start searching. Must be a railway station tile + * @param dir The direction in which to search. + * @return The platform length + */ +uint GetPlatformLength(TileIndex tile, DiagDirection dir) +{ + TileIndex start_tile = tile; + uint length = 0; + assert(IsRailwayStationTile(tile)); + assert(dir < DIAGDIR_END); + + do { + length ++; + tile += TileOffsByDir(dir); + } while (IsCompatibleTrainStationTile(tile, start_tile)); + + return length; +} + + static int32 RemoveRailroadStation(Station *st, TileIndex tile, uint32 flags) { int w,h; diff --git a/train_cmd.c b/train_cmd.c index 13f87f8748..04d1bdfafe 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -332,15 +332,11 @@ static int GetTrainAcceleration(Vehicle *v, bool mode) if (IsTileType(v->tile, MP_STATION) && IsFrontEngine(v)) { if (TrainShouldStop(v, v->tile)) { - int station_length = 0; - TileIndex tile = v->tile; + uint station_length = GetPlatformLength(v->tile, DirToDiagDir(v->direction)); int delta_v; + DEBUG(misc, 0) ("Length: %d", station_length); max_speed = 120; - do { - station_length++; - tile = TILE_ADD(tile, TileOffsByDir(v->direction / 2)); - } while (IsCompatibleTrainStationTile(tile, v->tile)); delta_v = v->cur_speed / (station_length + 1); if (v->max_speed > (v->cur_speed - delta_v))