5 #include <boost/optional.hpp>
20 const std::vector<DockingPorts>& dockingPorts,
23 if (!dockingPorts[port].IsConnected())
29 for (; i < dockingPorts.size(); ++i)
36 return boost::optional<size_t>();
51 typedef std::pair<size_t, size_t> PortRange;
52 boost::optional<PortRange> candidate;
54 const bool isPlanet = station->
isPlanet();
55 for (
size_t i = 0;
i < dockingPorts.size(); ++
i)
57 if (dockingPorts[
i].IsOccupied())
62 if (!dockingPorts[
i].IsConnected())
66 if (dockingPorts[
i].GetRadius() < player->
rSize())
70 dockingPorts[
i].GetPosition().Cast());
72 if (shortestDistance > distance)
76 shortestDistance = distance;
77 candidate = PortRange(
i,
i);
81 boost::optional<size_t> waypoint =
FindWaypoint(player, dockingPorts,
i);
84 shortestDistance = distance;
85 candidate = PortRange(
i, *waypoint);
94 assert(candidate->first <= candidate->second);
95 for (
size_t i = candidate->first; i <= candidate->
second; ++
i)
109 :
Order(MOVEMENT | FACING, SLOCATION),
120 if (player == NULL || station == NULL)
126 (this->*state)(player, station);
190 if (dockingPath.empty())
197 for (DockingPath::const_iterator it = dockingPath.begin(); it != dockingPath.end(); ++it)
207 assert(!dockingPath.empty());
215 else if (station->
CanDockWithMe(player) == dockingPath.back())
228 assert(!dockingPath.empty());
230 player->
ForceDock(station, dockingPath.back());
242 assert(!dockingPath.empty());
249 DockingPath::reverse_iterator it = dockingPath.rbegin();
251 for (; it != dockingPath.rend(); ++it)
279 const float turningSpeed = 1;
285 const unsigned char accuracy = 7;
287 const bool terminateAfterUse =
true;
293 Order *facing =
new ChangeHeading(position, accuracy, turningSpeed, terminateAfterUse);
294 Order *movement =
new MoveTo(position, useAfterburner, accuracy, terminateAfterUse);
298 const unsigned int blockedDuringFacing =
MOVEMENT;
300 const unsigned int blockedDuringMovement =
FACING;