mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-02 09:40:35 +00:00
145 lines
3.5 KiB
C++
145 lines
3.5 KiB
C++
/* $Id$ */
|
|
|
|
#ifndef YAPF_COMMON_HPP
|
|
#define YAPF_COMMON_HPP
|
|
|
|
|
|
template <class Types>
|
|
class CYapfOriginTileT
|
|
{
|
|
public:
|
|
typedef typename Types::Tpf Tpf;
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
protected:
|
|
TileIndex m_orgTile;
|
|
TrackdirBits m_orgTrackdirs;
|
|
|
|
FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
|
|
|
|
public:
|
|
void SetOrigin(TileIndex tile, TrackdirBits trackdirs)
|
|
{
|
|
m_orgTile = tile;
|
|
m_orgTrackdirs = trackdirs;
|
|
}
|
|
|
|
void PfSetStartupNodes()
|
|
{
|
|
for (TrackdirBits tdb = m_orgTrackdirs; tdb != TRACKDIR_BIT_NONE; tdb = (TrackdirBits)KillFirstBit2x64(tdb)) {
|
|
Trackdir td = (Trackdir)FindFirstBit2x64(tdb);
|
|
Node& n1 = Yapf().CreateNewNode();
|
|
n1.Set(NULL, m_orgTile, td);
|
|
Yapf().AddStartupNode(n1);
|
|
}
|
|
}
|
|
};
|
|
|
|
template <class Types>
|
|
class CYapfOriginTileTwoWayT
|
|
{
|
|
public:
|
|
typedef typename Types::Tpf Tpf;
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
protected:
|
|
TileIndex m_orgTile;
|
|
Trackdir m_orgTd;
|
|
TileIndex m_revTile;
|
|
Trackdir m_revTd;
|
|
int m_reverse_penalty;
|
|
bool m_treat_first_red_two_way_signal_as_eol;
|
|
|
|
FORCEINLINE Tpf& Yapf() {return *static_cast<Tpf*>(this);}
|
|
|
|
public:
|
|
void SetOrigin(TileIndex tile, Trackdir td, TileIndex tiler = INVALID_TILE, Trackdir tdr = INVALID_TRACKDIR, int reverse_penalty = 0, bool treat_first_red_two_way_signal_as_eol = true)
|
|
{
|
|
m_orgTile = tile;
|
|
m_orgTd = td;
|
|
m_revTile = tiler;
|
|
m_revTd = tdr;
|
|
m_reverse_penalty = reverse_penalty;
|
|
m_treat_first_red_two_way_signal_as_eol = treat_first_red_two_way_signal_as_eol;
|
|
}
|
|
|
|
void PfSetStartupNodes()
|
|
{
|
|
if (m_orgTile != INVALID_TILE && m_orgTd != INVALID_TRACKDIR) {
|
|
Node& n1 = Yapf().CreateNewNode();
|
|
n1.Set(NULL, m_orgTile, m_orgTd);
|
|
Yapf().AddStartupNode(n1);
|
|
}
|
|
if (m_revTile != INVALID_TILE && m_revTd != INVALID_TRACKDIR) {
|
|
Node& n2 = Yapf().CreateNewNode();
|
|
n2.Set(NULL, m_revTile, m_revTd);
|
|
n2.m_cost = m_reverse_penalty;
|
|
Yapf().AddStartupNode(n2);
|
|
}
|
|
}
|
|
|
|
FORCEINLINE bool TreatFirstRedTwoWaySignalAsEOL()
|
|
{
|
|
return Yapf().PfGetSettings().rail_firstred_twoway_eol && m_treat_first_red_two_way_signal_as_eol;
|
|
}
|
|
};
|
|
|
|
template <class Types>
|
|
class CYapfDestinationTileT
|
|
{
|
|
public:
|
|
typedef typename Types::Tpf Tpf;
|
|
typedef typename Types::NodeList::Titem Node; ///< this will be our node type
|
|
typedef typename Node::Key Key; ///< key to hash tables
|
|
|
|
protected:
|
|
TileIndex m_destTile;
|
|
TrackdirBits m_destTrackdirs;
|
|
|
|
public:
|
|
void SetDestination(TileIndex tile, TrackdirBits trackdirs)
|
|
{
|
|
m_destTile = tile;
|
|
m_destTrackdirs = trackdirs;
|
|
}
|
|
|
|
protected:
|
|
Tpf& Yapf() {return *static_cast<Tpf*>(this);}
|
|
|
|
public:
|
|
FORCEINLINE bool PfDetectDestination(Node& n)
|
|
{
|
|
bool bDest = (n.m_key.m_tile == m_destTile) && ((m_destTrackdirs & TrackdirToTrackdirBits(n.GetTrackdir())) != TRACKDIR_BIT_NONE);
|
|
return bDest;
|
|
}
|
|
|
|
inline bool PfCalcEstimate(Node& n)
|
|
{
|
|
int dx = abs(TileX(n.GetTile()) - TileX(m_destTile));
|
|
int dy = abs(TileY(n.GetTile()) - TileY(m_destTile));
|
|
assert(dx >= 0 && dy >= 0);
|
|
int dd = min(dx, dy);
|
|
int dxy = abs(dx - dy);
|
|
int d = 14 * dd + 10 * dxy;
|
|
n.m_estimate = n.m_cost + d /*+ d / 8*/;
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template <class Ttypes>
|
|
class CYapfT
|
|
: public Ttypes::PfBase
|
|
, public Ttypes::PfCost
|
|
, public Ttypes::PfCache
|
|
, public Ttypes::PfOrigin
|
|
, public Ttypes::PfDestination
|
|
, public Ttypes::PfFollow
|
|
{
|
|
};
|
|
|
|
|
|
|
|
#endif /* YAPF_COMMON_HPP */
|