Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
anonymous_namespace{autodocking.cpp} Namespace Reference

Functions

boost::optional< size_t > FindWaypoint (Unit *player, const std::vector< DockingPorts > &dockingPorts, size_t port)
 
Orders::AutoDocking::DockingPath FindDockingPort (Unit *player, Unit *station)
 

Function Documentation

Orders::AutoDocking::DockingPath anonymous_namespace{autodocking.cpp}::FindDockingPort ( Unit player,
Unit station 
)

Definition at line 42 of file autodocking.cpp.

References Unit::DockingPortLocations(), FindWaypoint(), Unit::GetTransformation(), i, Unit::isPlanet(), Magnitude(), max(), Unit::Position(), QVector, Unit::rSize(), second(), and Transform().

Referenced by Orders::AutoDocking::CanDock(), and Orders::AutoDocking::SelectionState().

44 {
45  // FIXME: Prefer outside docking ports (because they are more safe to travel to)
46  // FIXME: Ensure line-of-sight to first point
47  // FIXME: Start at the closest waypoint (and skip those before it)
48 
49  const std::vector<DockingPorts>& dockingPorts = station->DockingPortLocations();
50 
51  typedef std::pair<size_t, size_t> PortRange;
52  boost::optional<PortRange> candidate;
53  float shortestDistance = std::numeric_limits<float>::max();
54  const bool isPlanet = station->isPlanet();
55  for (size_t i = 0; i < dockingPorts.size(); ++i)
56  {
57  if (dockingPorts[i].IsOccupied())
58  continue;
59 
60  // Auto-dockable ports must be marked as connected (even if they have
61  // no associated waypoints)
62  if (!dockingPorts[i].IsConnected())
63  continue;
64 
65  // Does our ship fit into the docking port?
66  if (dockingPorts[i].GetRadius() < player->rSize())
67  continue;
68 
69  QVector dockingPosition = Transform(station->GetTransformation(),
70  dockingPorts[i].GetPosition().Cast());
71  float distance = (dockingPosition - player->Position()).Magnitude();
72  if (shortestDistance > distance)
73  {
74  if (isPlanet)
75  {
76  shortestDistance = distance;
77  candidate = PortRange(i, i);
78  }
79  else
80  {
81  boost::optional<size_t> waypoint = FindWaypoint(player, dockingPorts, i);
82  if (waypoint)
83  {
84  shortestDistance = distance;
85  candidate = PortRange(i, *waypoint);
86  }
87  }
88  }
89  }
90 
92  if (candidate)
93  {
94  assert(candidate->first <= candidate->second);
95  for (size_t i = candidate->first; i <= candidate->second; ++i)
96  {
97  result.push_front(i);
98  }
99  }
100  return result;
101 }
boost::optional<size_t> anonymous_namespace{autodocking.cpp}::FindWaypoint ( Unit player,
const std::vector< DockingPorts > &  dockingPorts,
size_t  port 
)

Definition at line 19 of file autodocking.cpp.

References DockingPorts::GetRadius(), i, DockingPorts::IsDockable(), and Unit::rSize().

Referenced by FindDockingPort().

22 {
23  if (!dockingPorts[port].IsConnected())
24  return port;
25 
26  // Subsequent waypoints belong to this port and are listed from closest
27  // to farthest.
28  size_t i = port + 1;
29  for (; i < dockingPorts.size(); ++i)
30  {
31  const DockingPorts& waypoint = dockingPorts[i];
32  if (waypoint.IsDockable()) // No further waypoints
33  break;
34  // Do not use docking port if one of the waypoints are too small
35  if (waypoint.GetRadius() < player->rSize())
36  return boost::optional<size_t>();
37  }
38  return i - 1;
39 }