|
@@ -18,45 +18,45 @@
|
|
|
/** Node Follower module of YAPF for ships */
|
|
|
template <class Types>
|
|
|
class CYapfFollowShipT
|
|
|
{
|
|
|
public:
|
|
|
typedef typename Types::Tpf Tpf; ///< the pathfinder class (derived from THIS class)
|
|
|
typedef typename Types::TrackFollower TrackFollower;
|
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
|
|
protected:
|
|
|
/** to access inherited path finder */
|
|
|
FORCEINLINE Tpf& Yapf()
|
|
|
inline Tpf& Yapf()
|
|
|
{
|
|
|
return *static_cast<Tpf*>(this);
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
/**
|
|
|
* Called by YAPF to move from the given node to the next tile. For each
|
|
|
* reachable trackdir on the new tile creates new node, initializes it
|
|
|
* and adds it to the open list by calling Yapf().AddNewNode(n)
|
|
|
*/
|
|
|
inline void PfFollowNode(Node& old_node)
|
|
|
{
|
|
|
TrackFollower F(Yapf().GetVehicle());
|
|
|
if (F.Follow(old_node.m_key.m_tile, old_node.m_key.m_td)) {
|
|
|
Yapf().AddMultipleNodes(&old_node, F);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/** return debug report character to identify the transportation type */
|
|
|
FORCEINLINE char TransportTypeChar() const
|
|
|
inline char TransportTypeChar() const
|
|
|
{
|
|
|
return 'w';
|
|
|
}
|
|
|
|
|
|
static Trackdir ChooseShipTrack(const Ship *v, TileIndex tile, DiagDirection enterdir, TrackBits tracks, bool &path_found)
|
|
|
{
|
|
|
/* handle special case - when next tile is destination tile */
|
|
|
if (tile == v->dest_tile) {
|
|
|
/* convert tracks to trackdirs */
|
|
|
TrackdirBits trackdirs = (TrackdirBits)(tracks | ((int)tracks << 8));
|
|
|
/* choose any trackdir reachable from enterdir */
|
|
|
trackdirs &= DiagdirReachesTrackdirs(enterdir);
|
|
@@ -114,25 +114,25 @@ protected:
|
|
|
/** to access inherited path finder */
|
|
|
Tpf& Yapf()
|
|
|
{
|
|
|
return *static_cast<Tpf*>(this);
|
|
|
}
|
|
|
|
|
|
public:
|
|
|
/**
|
|
|
* Called by YAPF to calculate the cost from the origin to the given node.
|
|
|
* Calculates only the cost of given node, adds it to the parent node cost
|
|
|
* and stores the result into Node::m_cost member
|
|
|
*/
|
|
|
FORCEINLINE bool PfCalcCost(Node& n, const TrackFollower *tf)
|
|
|
inline bool PfCalcCost(Node& n, const TrackFollower *tf)
|
|
|
{
|
|
|
/* base tile cost depending on distance */
|
|
|
int c = IsDiagonalTrackdir(n.GetTrackdir()) ? YAPF_TILE_LENGTH : YAPF_TILE_CORNER_LENGTH;
|
|
|
/* additional penalty for curves */
|
|
|
if (n.m_parent != NULL && n.GetTrackdir() != NextTrackdir(n.m_parent->GetTrackdir())) {
|
|
|
/* new trackdir does not match the next one when going straight */
|
|
|
c += YAPF_TILE_LENGTH;
|
|
|
}
|
|
|
|
|
|
/* Skipped tile cost for aqueducts. */
|
|
|
c += YAPF_TILE_LENGTH * tf->m_tiles_skipped;
|
|
|
|