summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--station.h1
-rw-r--r--station_cmd.c22
-rw-r--r--train_cmd.c8
3 files changed, 25 insertions, 6 deletions
diff --git a/station.h b/station.h
index f6907a570..dd59b1ba9 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 00254dd07..0339ec0a6 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 13f87f874..04d1bdfaf 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))