1
0
Fork 0

Codechange: Move platform related code to separate files.

pull/8480/head
J0anJosep 2020-12-23 22:32:53 +01:00
parent f161a138b9
commit 4854685bec
17 changed files with 301 additions and 142 deletions

View File

@ -342,6 +342,9 @@ add_files(
picker_func.h picker_func.h
picker_gui.cpp picker_gui.cpp
picker_gui.h picker_gui.h
platform_func.h
platform_type.h
platform.cpp
progress.cpp progress.cpp
progress.h progress.h
querystring_gui.h querystring_gui.h

View File

@ -140,24 +140,6 @@ struct BaseStation : StationPool::PoolItem<&_station_pool> {
*/ */
virtual void GetTileArea(TileArea *ta, StationType type) const = 0; virtual void GetTileArea(TileArea *ta, StationType type) const = 0;
/**
* Obtain the length of a platform
* @pre tile must be a rail station tile
* @param tile A tile that contains the platform in question
* @return The length of the platform
*/
virtual uint GetPlatformLength(TileIndex tile) const = 0;
/**
* 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 rail station tile
* @param dir The direction in which to search.
* @return The platform length
*/
virtual uint GetPlatformLength(TileIndex tile, DiagDirection dir) const = 0;
/** /**
* Get the base station belonging to a specific tile. * Get the base station belonging to a specific tile.
* @param tile The tile to get the base station from. * @param tile The tile to get the base station from.

View File

@ -56,6 +56,7 @@
#include "timer/timer_game_calendar.h" #include "timer/timer_game_calendar.h"
#include "timer/timer_game_economy.h" #include "timer/timer_game_economy.h"
#include "depot_base.h" #include "depot_base.h"
#include "platform_func.h"
#include "table/strings.h" #include "table/strings.h"
#include "table/pricebase.h" #include "table/pricebase.h"
@ -1621,14 +1622,13 @@ static void ReserveConsist(Station *st, Vehicle *u, CargoArray *consist_capleft,
* Update the vehicle's load_unload_ticks, the time it will wait until it tries to load or unload * Update the vehicle's load_unload_ticks, the time it will wait until it tries to load or unload
* again. Adjust for overhang of trains and set it at least to 1. * again. Adjust for overhang of trains and set it at least to 1.
* @param front The vehicle to be updated. * @param front The vehicle to be updated.
* @param st The station the vehicle is loading at.
* @param ticks The time it would normally wait, based on cargo loaded and unloaded. * @param ticks The time it would normally wait, based on cargo loaded and unloaded.
*/ */
static void UpdateLoadUnloadTicks(Vehicle *front, const Station *st, int ticks) static void UpdateLoadUnloadTicks(Vehicle *front, int ticks)
{ {
if (front->type == VEH_TRAIN && _settings_game.order.station_length_loading_penalty) { if (front->type == VEH_TRAIN && _settings_game.order.station_length_loading_penalty) {
/* Each platform tile is worth 2 rail vehicles. */ /* Each platform tile is worth 2 rail vehicles. */
int overhang = front->GetGroundVehicleCache()->cached_total_length - st->GetPlatformLength(front->tile) * TILE_SIZE; int overhang = front->GetGroundVehicleCache()->cached_total_length - GetPlatformLength(front->tile) * TILE_SIZE;
if (overhang > 0) { if (overhang > 0) {
ticks <<= 1; ticks <<= 1;
ticks += (overhang * ticks) / 8; ticks += (overhang * ticks) / 8;
@ -1890,9 +1890,9 @@ static void LoadUnloadVehicle(Vehicle *front)
SetBit(front->vehicle_flags, VF_STOP_LOADING); SetBit(front->vehicle_flags, VF_STOP_LOADING);
} }
UpdateLoadUnloadTicks(front, st, new_load_unload_ticks); UpdateLoadUnloadTicks(front, new_load_unload_ticks);
} else { } else {
UpdateLoadUnloadTicks(front, st, 20); // We need the ticks for link refreshing. UpdateLoadUnloadTicks(front, 20); // We need the ticks for link refreshing.
bool finished_loading = true; bool finished_loading = true;
if (front->current_order.GetLoadType() & OLFB_FULL_LOAD) { if (front->current_order.GetLoadType() & OLFB_FULL_LOAD) {
if (front->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) { if (front->current_order.GetLoadType() == OLF_FULL_LOAD_ANY) {

View File

@ -24,6 +24,7 @@
#include "newgrf_animation_base.h" #include "newgrf_animation_base.h"
#include "newgrf_class_func.h" #include "newgrf_class_func.h"
#include "timer/timer_game_calendar.h" #include "timer/timer_game_calendar.h"
#include "platform_func.h"
#include "safeguards.h" #include "safeguards.h"

View File

@ -18,6 +18,7 @@
#include "../tunnelbridge_map.h" #include "../tunnelbridge_map.h"
#include "../depot_map.h" #include "../depot_map.h"
#include "pathfinder_func.h" #include "pathfinder_func.h"
#include "../platform_func.h"
/** /**
* Track follower helper template class (can serve pathfinders and vehicle * Track follower helper template class (can serve pathfinders and vehicle
@ -370,12 +371,11 @@ protected:
/* special handling for rail stations - get to the end of platform */ /* special handling for rail stations - get to the end of platform */
if (IsRailTT() && m_is_station) { if (IsRailTT() && m_is_station) {
/* entered railway station /* Entered a platform. */
* get platform length */ assert(HasStationTileRail(m_new_tile));
uint length = BaseStation::GetByTile(m_new_tile)->GetPlatformLength(m_new_tile, TrackdirToExitdir(m_old_td)); /* How big step we must do to get to the last platform tile? */
/* how big step we must do to get to the last platform tile? */ m_tiles_skipped = GetPlatformLength(m_new_tile, TrackdirToExitdir(m_old_td)) - 1;
m_tiles_skipped = length - 1; /* Move to the platform end. */
/* move to the platform end */
TileIndexDiff diff = TileOffsByDiagDir(m_exitdir); TileIndexDiff diff = TileOffsByDiagDir(m_exitdir);
diff *= m_tiles_skipped; diff *= m_tiles_skipped;
m_new_tile = TileAdd(m_new_tile, diff); m_new_tile = TileAdd(m_new_tile, diff);

View File

@ -590,12 +590,11 @@ no_entry_cost: // jump here at the beginning if the node has no parent (it is th
} }
} }
/* Station platform-length penalty. */ /* Platform-length penalty. */
if ((end_segment_reason & ESRB_STATION) != ESRB_NONE) { if ((end_segment_reason & ESRB_STATION) != ESRB_NONE) {
const BaseStation *st = BaseStation::GetByTile(n.GetLastTile()); assert(HasStationTileRail(n.GetLastTile()));
assert(st != nullptr); uint platform_length = GetPlatformLength(n.GetLastTile(), ReverseDiagDir(TrackdirToExitdir(n.GetLastTrackdir())));
uint platform_length = st->GetPlatformLength(n.GetLastTile(), ReverseDiagDir(TrackdirToExitdir(n.GetLastTrackdir()))); /* Reduce the extra cost caused by passing-platform penalty (each platform receives it in the segment cost). */
/* Reduce the extra cost caused by passing-station penalty (each station receives it in the segment cost). */
extra_cost -= Yapf().PfGetSettings().rail_station_penalty * platform_length; extra_cost -= Yapf().PfGetSettings().rail_station_penalty * platform_length;
/* Add penalty for the inappropriate platform length. */ /* Add penalty for the inappropriate platform length. */
extra_cost += PlatformLengthPenalty(platform_length); extra_cost += PlatformLengthPenalty(platform_length);

View File

@ -16,6 +16,7 @@
#include "yapf_destrail.hpp" #include "yapf_destrail.hpp"
#include "../../viewport_func.h" #include "../../viewport_func.h"
#include "../../newgrf_station.h" #include "../../newgrf_station.h"
#include "../../platform_func.h"
#include "../../safeguards.h" #include "../../safeguards.h"

View File

@ -47,28 +47,6 @@ TrackBits GetReservedTrackbits(TileIndex t)
return TRACK_BIT_NONE; return TRACK_BIT_NONE;
} }
/**
* Set the reservation for a complete station platform.
* @pre IsRailStationTile(start)
* @param start starting tile of the platform
* @param dir the direction in which to follow the platform
* @param b the state the reservation should be set to
*/
void SetRailStationPlatformReservation(TileIndex start, DiagDirection dir, bool b)
{
TileIndex tile = start;
TileIndexDiff diff = TileOffsByDiagDir(dir);
assert(IsRailStationTile(start));
assert(GetRailStationAxis(start) == DiagDirToAxis(dir));
do {
SetRailStationReservation(tile, b);
MarkTileDirtyByTile(tile);
tile = TileAdd(tile, diff);
} while (IsCompatibleTrainStationTile(tile, start));
}
/** /**
* Try to reserve a specific track on a tile * Try to reserve a specific track on a tile
* @param tile the tile * @param tile the tile

138
src/platform.cpp 100644
View File

@ -0,0 +1,138 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file platform.cpp Implementation of platform functions. */
#include "stdafx.h"
#include "station_map.h"
#include "platform_func.h"
#include "viewport_func.h"
/**
* Set the reservation for a complete station platform.
* @pre IsRailStationTile(start)
* @param start starting tile of the platform
* @param dir the direction in which to follow the platform
* @param b the state the reservation should be set to
*/
void SetRailStationPlatformReservation(TileIndex start, DiagDirection dir, bool b)
{
TileIndex tile = start;
TileIndexDiff diff = TileOffsByDiagDir(dir);
assert(IsRailStationTile(start));
assert(GetRailStationAxis(start) == DiagDirToAxis(dir));
do {
SetRailStationReservation(tile, b);
MarkTileDirtyByTile(tile);
tile = TileAdd(tile, diff);
} while (IsCompatibleTrainStationTile(tile, start));
}
/**
* Set the reservation for a complete platform in a given direction.
* @param start starting tile of the platform
* @param dir the direction in which to follow the platform
* @param b the state the reservation should be set to
*/
void SetPlatformReservation(TileIndex start, DiagDirection dir, bool b)
{
switch (GetPlatformType(start)) {
case PT_RAIL_STATION:
SetRailStationPlatformReservation(start, dir, b);
return;
case PT_RAIL_WAYPOINT:
SetRailStationReservation(start, b);
return;
default: NOT_REACHED();
}
}
/**
* Get the length of a rail station platform.
* @pre IsRailStationTile(tile)
* @param tile Tile to check
* @return The length of the platform in tile length.
*/
uint GetRailStationPlatformLength(TileIndex tile)
{
assert(IsRailStationTile(tile));
TileIndexDiff delta = (GetRailStationAxis(tile) == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
TileIndex t = tile;
uint len = 0;
do {
t -= delta;
len++;
} while (IsCompatibleTrainStationTile(t, tile));
t = tile;
do {
t += delta;
len++;
} while (IsCompatibleTrainStationTile(t, tile));
return len - 1;
}
/**
* Get the length of a rail station platform in a given direction.
* @pre IsRailStationTile(tile)
* @param tile Tile to check
* @param dir Direction to check
* @return The length of the platform in tile length in the given direction.
*/
uint GetRailStationPlatformLength(TileIndex tile, DiagDirection dir)
{
TileIndex start_tile = tile;
uint length = 0;
assert(IsRailStationTile(tile));
assert(dir < DIAGDIR_END);
do {
length++;
tile += TileOffsByDiagDir(dir);
} while (IsCompatibleTrainStationTile(tile, start_tile));
return length;
}
/**
* Get the length of a platform.
* @param tile Tile to check
* @return The length of the platform in tile length.
*/
uint GetPlatformLength(TileIndex tile)
{
switch (GetPlatformType(tile)) {
case PT_RAIL_STATION:
return GetRailStationPlatformLength(tile);
case PT_RAIL_WAYPOINT:
return 1;
default: NOT_REACHED();
}
}
/**
* Get the length of a rail depot platform in a given direction.
* @pre IsRailDepotTile(tile)
* @param tile Tile to check
* @param dir Direction to check
* @return The length of the platform in tile length in the given direction.
*/
uint GetPlatformLength(TileIndex tile, DiagDirection dir)
{
switch (GetPlatformType(tile)) {
case PT_RAIL_STATION:
return GetRailStationPlatformLength(tile, dir);
case PT_RAIL_WAYPOINT:
return 1;
default: NOT_REACHED();
}
}

104
src/platform_func.h 100644
View File

@ -0,0 +1,104 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file platform_func.h Functions related with platforms (tiles in a row that are connected somehow). */
#ifndef PLATFORM_FUNC_H
#define PLATFORM_FUNC_H
#include "station_map.h"
#include "platform_type.h"
/**
* Check if a tile is a valid continuation to a railstation tile.
* The tile \a test_tile is a valid continuation to \a station_tile, if all of the following are true:
* \li \a test_tile is a rail station tile
* \li the railtype of \a test_tile is compatible with the railtype of \a station_tile
* \li the tracks on \a test_tile and \a station_tile are in the same direction
* \li both tiles belong to the same station
* \li \a test_tile is not blocked (@see IsStationTileBlocked)
* @param test_tile Tile to test
* @param station_tile Station tile to compare with
* @pre IsRailStationTile(station_tile)
* @return true if the two tiles are compatible
*/
static inline bool IsCompatibleTrainStationTile(TileIndex test_tile, TileIndex station_tile)
{
assert(IsRailStationTile(station_tile));
return IsRailStationTile(test_tile) && !IsStationTileBlocked(test_tile) &&
IsCompatibleRail(GetRailType(test_tile), GetRailType(station_tile)) &&
GetRailStationAxis(test_tile) == GetRailStationAxis(station_tile) &&
GetStationIndex(test_tile) == GetStationIndex(station_tile);
}
/**
* Returns the type of platform of a given tile.
* @param tile Tile to check
* @return the type of platform (rail station, rail waypoint...)
*/
static inline PlatformType GetPlatformType(TileIndex tile)
{
switch (GetTileType(tile)) {
case MP_STATION:
if (IsRailStation(tile)) return PT_RAIL_STATION;
if (IsRailWaypoint(tile)) return PT_RAIL_WAYPOINT;
break;
default: break;
}
return INVALID_PLATFORM_TYPE;
}
/**
* Check whether a tile is a known platform type.
* @param tile to check
* @return whether the tile is a known platform type.
*/
static inline bool IsPlatformTile(TileIndex tile)
{
return GetPlatformType(tile) != INVALID_PLATFORM_TYPE;
}
/**
* Check whether a platform tile is reserved.
* @param tile to check
* @return whether the platform tile is reserved
*/
static inline bool HasPlatformReservation(TileIndex tile)
{
switch(GetPlatformType(tile)) {
case PT_RAIL_STATION:
case PT_RAIL_WAYPOINT:
return HasStationReservation(tile);
default: NOT_REACHED();
}
}
/**
* Check whether two tiles are compatible platform tiles: they must have the same
* platform type and (depending on the platform type) its railtype or other specs.
* @param test_tile the tile to check
* @param orig_tile the tile with the platform type we are interested in
* @return whether the two tiles are compatible tiles for defining a platform
*/
static inline bool IsCompatiblePlatformTile(TileIndex test_tile, TileIndex orig_tile)
{
switch (GetPlatformType(orig_tile)) {
case PT_RAIL_STATION:
return IsCompatibleTrainStationTile(test_tile, orig_tile);
case PT_RAIL_WAYPOINT:
return test_tile == orig_tile;
default: NOT_REACHED();
}
}
void SetPlatformReservation(TileIndex start, DiagDirection dir, bool b);
uint GetPlatformLength(TileIndex tile);
uint GetPlatformLength(TileIndex tile, DiagDirection dir);
#endif /* PLATFORM_FUNC_H */

View File

@ -0,0 +1,22 @@
/*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file platform_type.h Types related to platforms. */
#ifndef PLATFORM_TYPE_H
#define PLATFORM_TYPE_H
#include "core/enum_type.hpp"
enum PlatformType {
PT_RAIL_STATION,
PT_RAIL_WAYPOINT,
PT_END,
INVALID_PLATFORM_TYPE = PT_END,
};
#endif /* PLATFORM_TYPE_H */

View File

@ -269,43 +269,6 @@ void Station::MarkTilesDirty(bool cargo_change) const
} }
} }
/* virtual */ uint Station::GetPlatformLength(TileIndex tile) const
{
assert(this->TileBelongsToRailStation(tile));
TileIndexDiff delta = (GetRailStationAxis(tile) == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
TileIndex t = tile;
uint len = 0;
do {
t -= delta;
len++;
} while (IsCompatibleTrainStationTile(t, tile));
t = tile;
do {
t += delta;
len++;
} while (IsCompatibleTrainStationTile(t, tile));
return len - 1;
}
/* virtual */ uint Station::GetPlatformLength(TileIndex tile, DiagDirection dir) const
{
TileIndex start_tile = tile;
uint length = 0;
assert(IsRailStationTile(tile));
assert(dir < DIAGDIR_END);
do {
length++;
tile += TileOffsByDiagDir(dir);
} while (IsCompatibleTrainStationTile(tile, start_tile));
return length;
}
/** /**
* Get the catchment size of an individual station tile. * Get the catchment size of an individual station tile.
* @param tile Station tile to get catchment size of. * @param tile Station tile to get catchment size of.

View File

@ -488,9 +488,6 @@ public:
void MoveSign(TileIndex new_xy) override; void MoveSign(TileIndex new_xy) override;
void AfterStationTileSetChange(bool adding, StationType type); void AfterStationTileSetChange(bool adding, StationType type);
uint GetPlatformLength(TileIndex tile, DiagDirection dir) const override;
uint GetPlatformLength(TileIndex tile) const override;
void RecomputeCatchment(bool no_clear_nearby_lists = false); void RecomputeCatchment(bool no_clear_nearby_lists = false);
static void RecomputeCatchmentForAll(); static void RecomputeCatchmentForAll();

View File

@ -68,6 +68,7 @@
#include "cheat_type.h" #include "cheat_type.h"
#include "road_func.h" #include "road_func.h"
#include "depot_base.h" #include "depot_base.h"
#include "platform_func.h"
#include "widgets/station_widget.h" #include "widgets/station_widget.h"
@ -1240,9 +1241,10 @@ CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_
static void FreeTrainReservation(Train *v) static void FreeTrainReservation(Train *v)
{ {
FreeTrainTrackReservation(v); FreeTrainTrackReservation(v);
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); if (IsPlatformTile(v->tile)) SetPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false);
v = v->Last(); v = v->Last();
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false); if (IsPlatformTile(v->tile)) SetPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false);
} }
/** /**
@ -1251,10 +1253,10 @@ static void FreeTrainReservation(Train *v)
*/ */
static void RestoreTrainReservation(Train *v) static void RestoreTrainReservation(Train *v)
{ {
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true); if (IsPlatformTile(v->tile)) SetPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
TryPathReserve(v, true, true); TryPathReserve(v, true, true);
v = v->Last(); v = v->Last();
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true); if (IsPlatformTile(v->tile)) SetPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), true);
} }
/** /**
@ -1522,21 +1524,21 @@ CommandCost CmdBuildRailStation(DoCommandFlag flags, TileIndex tile_org, RailTyp
TileIndex platform_end = tile; TileIndex platform_end = tile;
/* We can only account for tiles that are reachable from this tile, so ignore primarily blocked tiles while finding the platform begin and end. */ /* We can only account for tiles that are reachable from this tile, so ignore primarily blocked tiles while finding the platform begin and end. */
for (TileIndex next_tile = platform_begin - tile_offset; IsCompatibleTrainStationTile(next_tile, platform_begin); next_tile -= tile_offset) { for (TileIndex next_tile = platform_begin - tile_offset; IsCompatiblePlatformTile(next_tile, platform_begin); next_tile -= tile_offset) {
platform_begin = next_tile; platform_begin = next_tile;
} }
for (TileIndex next_tile = platform_end + tile_offset; IsCompatibleTrainStationTile(next_tile, platform_end); next_tile += tile_offset) { for (TileIndex next_tile = platform_end + tile_offset; IsCompatiblePlatformTile(next_tile, platform_end); next_tile += tile_offset) {
platform_end = next_tile; platform_end = next_tile;
} }
/* If there is at least on reservation on the platform, we reserve the whole platform. */ /* If there is at least on reservation on the platform, we reserve the whole platform. */
bool reservation = false; bool reservation = false;
for (TileIndex t = platform_begin; !reservation && t <= platform_end; t += tile_offset) { for (TileIndex t = platform_begin; !reservation && t <= platform_end; t += tile_offset) {
reservation = HasStationReservation(t); reservation = HasPlatformReservation(t);
} }
if (reservation) { if (reservation) {
SetRailStationPlatformReservation(platform_begin, dir, true); SetPlatformReservation(platform_begin, dir, true);
} }
} }

View File

@ -521,28 +521,6 @@ inline TrackBits GetRailStationTrackBits(Tile t)
return AxisToTrackBits(GetRailStationAxis(t)); return AxisToTrackBits(GetRailStationAxis(t));
} }
/**
* Check if a tile is a valid continuation to a railstation tile.
* The tile \a test_tile is a valid continuation to \a station_tile, if all of the following are true:
* \li \a test_tile is a rail station tile
* \li the railtype of \a test_tile is compatible with the railtype of \a station_tile
* \li the tracks on \a test_tile and \a station_tile are in the same direction
* \li both tiles belong to the same station
* \li \a test_tile is not blocked (@see IsStationTileBlocked)
* @param test_tile Tile to test
* @param station_tile Station tile to compare with
* @pre IsRailStationTile(station_tile)
* @return true if the two tiles are compatible
*/
inline bool IsCompatibleTrainStationTile(Tile test_tile, Tile station_tile)
{
assert(IsRailStationTile(station_tile));
return IsRailStationTile(test_tile) && !IsStationTileBlocked(test_tile) &&
IsCompatibleRail(GetRailType(test_tile), GetRailType(station_tile)) &&
GetRailStationAxis(test_tile) == GetRailStationAxis(station_tile) &&
GetStationIndex(test_tile) == GetStationIndex(station_tile);
}
/** /**
* Get the reservation state of the rail station * Get the reservation state of the rail station
* @pre HasStationRail(t) * @pre HasStationRail(t)

View File

@ -39,6 +39,7 @@
#include "timer/timer_game_calendar.h" #include "timer/timer_game_calendar.h"
#include "timer/timer_game_economy.h" #include "timer/timer_game_economy.h"
#include "depot_base.h" #include "depot_base.h"
#include "platform_func.h"
#include "table/strings.h" #include "table/strings.h"
#include "table/train_sprites.h" #include "table/train_sprites.h"
@ -263,9 +264,9 @@ void Train::ConsistChanged(ConsistChangeFlags allowed_changes)
*/ */
int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length) int GetTrainStopLocation(StationID station_id, TileIndex tile, const Train *v, int *station_ahead, int *station_length)
{ {
const Station *st = Station::Get(station_id); assert(IsRailStationTile(tile));
*station_ahead = st->GetPlatformLength(tile, DirToDiagDir(v->direction)) * TILE_SIZE; *station_ahead = GetPlatformLength(tile, DirToDiagDir(v->direction)) * TILE_SIZE;
*station_length = st->GetPlatformLength(tile) * TILE_SIZE; *station_length = GetPlatformLength(tile) * TILE_SIZE;
/* Default to the middle of the station for stations stops that are not in /* Default to the middle of the station for stations stops that are not in
* the order list like intermediate stations when non-stop is disabled */ * the order list like intermediate stations when non-stop is disabled */
@ -2183,7 +2184,7 @@ void ReverseTrainDirection(Train *v)
/* If we are on a depot tile facing outwards, do not treat the current tile as safe. */ /* If we are on a depot tile facing outwards, do not treat the current tile as safe. */
if (IsStandardRailDepotTile(v->tile) && TrackdirToExitdir(v->GetVehicleTrackdir()) == GetRailDepotDirection(v->tile)) first_tile_okay = false; if (IsStandardRailDepotTile(v->tile) && TrackdirToExitdir(v->GetVehicleTrackdir()) == GetRailDepotDirection(v->tile)) first_tile_okay = false;
if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true); if (IsPlatformTile(v->tile)) SetPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), true);
if (TryPathReserve(v, false, first_tile_okay)) { if (TryPathReserve(v, false, first_tile_okay)) {
/* Do a look-ahead now in case our current tile was already a safe tile. */ /* Do a look-ahead now in case our current tile was already a safe tile. */
CheckNextTrainTile(v); CheckNextTrainTile(v);
@ -2526,8 +2527,8 @@ static void ClearPathReservation(const Train *v, TileIndex tile, Trackdir track_
TileIndex new_tile = TileAddByDiagDir(tile, dir); TileIndex new_tile = TileAddByDiagDir(tile, dir);
/* If the new tile is not a further tile of the same station, we /* If the new tile is not a further tile of the same station, we
* clear the reservation for the whole platform. */ * clear the reservation for the whole platform. */
if (!IsCompatibleTrainStationTile(new_tile, tile)) { if (!IsCompatiblePlatformTile(new_tile, tile)) {
SetRailStationPlatformReservation(tile, ReverseDiagDir(dir), false); SetPlatformReservation(tile, ReverseDiagDir(dir), false);
} }
} else { } else {
/* Any other tile */ /* Any other tile */

View File

@ -45,16 +45,6 @@ struct Waypoint final : SpecializedStation<Waypoint, true> {
void GetTileArea(TileArea *ta, StationType type) const override; void GetTileArea(TileArea *ta, StationType type) const override;
uint GetPlatformLength(TileIndex, DiagDirection) const override
{
return 1;
}
uint GetPlatformLength(TileIndex) const override
{
return 1;
}
/** /**
* Is this a single tile waypoint? * Is this a single tile waypoint?
* @return true if it is. * @return true if it is.