12 #include "../../stdafx.h" 
   13 #include "../../ship.h" 
   18 #include "../../safeguards.h" 
   21 template <
class Types>
 
   25   typedef typename Types::Tpf 
Tpf;                     
 
   26   typedef typename Types::TrackFollower TrackFollower;
 
   27   typedef typename Types::NodeList::Titem 
Node;        
 
   28   typedef typename Node::Key 
Key;                      
 
   34     return *
static_cast<Tpf *
>(
this);
 
   45     TrackFollower F(
Yapf().GetVehicle());
 
   46     if (F.Follow(old_node.m_key.m_tile, old_node.m_key.m_td)) {
 
   47       Yapf().AddMultipleNodes(&old_node, F);
 
   84     pf.SetOrigin(src_tile, trackdirs);
 
   85     pf.SetDestination(v->
dest_tile, dest_trackdirs);
 
   87     path_found = pf.FindPath(v);
 
   91     Node *pNode = pf.GetBestNode();
 
   94       Node *pPrevNode = NULL;
 
   95       while (pNode->m_parent != NULL) {
 
   97         pNode = pNode->m_parent;
 
  100       Node &best_next_node = *pPrevNode;
 
  101       assert(best_next_node.GetTile() == tile);
 
  102       next_trackdir = best_next_node.GetTrackdir();
 
  104     return next_trackdir;
 
  125     pf.SetDestination(v->
dest_tile, dest_trackdirs);
 
  127     if (!pf.FindPath(v)) 
return false;
 
  129     Node *pNode = pf.GetBestNode();
 
  130     if (pNode == NULL) 
return false;
 
  134     while (pNode->m_parent != NULL) {
 
  135       pNode = pNode->m_parent;
 
  138     Trackdir best_trackdir = pNode->GetTrackdir();
 
  139     assert(best_trackdir == td1 || best_trackdir == td2);
 
  140     return best_trackdir == td2;
 
  145 template <
class Types>
 
  149   typedef typename Types::Tpf 
Tpf;              
 
  150   typedef typename Types::TrackFollower TrackFollower;
 
  151   typedef typename Types::NodeList::Titem 
Node; 
 
  152   typedef typename Node::Key 
Key;               
 
  158     return *
static_cast<Tpf *
>(
this);
 
  172     if (n.GetTrackdir() != 
NextTrackdir(n.m_parent->GetTrackdir())) {
 
  183     if (speed_frac > 0) c += 
YAPF_TILE_LENGTH * (1 + tf->m_tiles_skipped) * speed_frac / (256 - speed_frac);
 
  186     n.m_cost = n.m_parent->m_cost + c;
 
  195 template <
class Tpf_, 
class Ttrack_follower, 
class Tnode_list>
 
  218 struct CYapfShip1 : 
CYapfT<CYapfShip_TypesT<CYapfShip1, CFollowTrackWater    , CShipNodeListTrackDir> > {};
 
  220 struct CYapfShip2 : 
CYapfT<CYapfShip_TypesT<CYapfShip2, CFollowTrackWater    , CShipNodeListExitDir > > {};
 
  222 struct CYapfShip3 : 
CYapfT<CYapfShip_TypesT<CYapfShip3, CFollowTrackWaterNo90, CShipNodeListTrackDir> > {};
 
  229   PfnChooseShipTrack pfnChooseShipTrack = CYapfShip2::ChooseShipTrack; 
 
  233     pfnChooseShipTrack = &CYapfShip3::ChooseShipTrack; 
 
  235     pfnChooseShipTrack = &CYapfShip1::ChooseShipTrack; 
 
  238   Trackdir td_ret = pfnChooseShipTrack(v, tile, enterdir, tracks, path_found);
 
  258   bool reverse = pfnCheckReverseShip(v, tile, td, td_rev);