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);