diff --git a/src/screenComponents/radarView.cpp b/src/screenComponents/radarView.cpp index 41d31a0aa5..2ba1074672 100644 --- a/src/screenComponents/radarView.cpp +++ b/src/screenComponents/radarView.cpp @@ -417,7 +417,7 @@ void GuiRadarView::drawWaypoints(sf::RenderTarget& window) for(unsigned int n=0; nwaypoints.size(); n++) { - sf::Vector2f screen_position = worldToScreen(my_spaceship->waypoints[n]); + sf::Vector2f screen_position = worldToScreen(my_spaceship->waypoints[n].first); sf::Sprite object_sprite; textureManager.setTexture(object_sprite, "waypoint"); @@ -425,7 +425,7 @@ void GuiRadarView::drawWaypoints(sf::RenderTarget& window) object_sprite.setPosition(screen_position - sf::Vector2f(0, 10)); object_sprite.setScale(0.8, 0.8); window.draw(object_sprite); - drawText(window, sf::FloatRect(screen_position.x, screen_position.y - 10, 0, 0), string(n + 1), ACenter, 18, bold_font, colorConfig.ship_waypoint_text); + drawText(window, sf::FloatRect(screen_position.x, screen_position.y - 10, 0, 0), string(my_spaceship->waypoints[n].second), ACenter, 18, bold_font, colorConfig.ship_waypoint_text); if (style != Rectangular && sf::length(screen_position - radar_screen_center) > std::min(rect.width, rect.height) * 0.5f) { @@ -435,7 +435,7 @@ void GuiRadarView::drawWaypoints(sf::RenderTarget& window) object_sprite.setRotation(sf::vector2ToAngle(screen_position - radar_screen_center) - 90); window.draw(object_sprite); - drawText(window, sf::FloatRect(screen_position.x, screen_position.y, 0, 0), string(n + 1), ACenter, 18, bold_font, colorConfig.ship_waypoint_text); + drawText(window, sf::FloatRect(screen_position.x, screen_position.y, 0, 0), string(my_spaceship->waypoints[n].second), ACenter, 18, bold_font, colorConfig.ship_waypoint_text); } } } @@ -736,7 +736,7 @@ void GuiRadarView::drawTargets(sf::RenderTarget& window) if (my_spaceship && targets->getWaypointIndex() > -1 && targets->getWaypointIndex() < my_spaceship->getWaypointCount()) { - sf::Vector2f object_position_on_screen = worldToScreen(my_spaceship->waypoints[targets->getWaypointIndex()]); + sf::Vector2f object_position_on_screen = worldToScreen(my_spaceship->waypoints[targets->getWaypointIndex()].first); target_sprite.setPosition(object_position_on_screen - sf::Vector2f(0, 10)); window.draw(target_sprite); diff --git a/src/screenComponents/targetsContainer.cpp b/src/screenComponents/targetsContainer.cpp index 53471cd1fc..69897a310e 100644 --- a/src/screenComponents/targetsContainer.cpp +++ b/src/screenComponents/targetsContainer.cpp @@ -76,13 +76,13 @@ void TargetsContainer::setToClosestTo(sf::Vector2f position, float max_range, ES { for(int n=0; ngetWaypointCount(); n++) { - if ((my_spaceship->waypoints[n] - position) < max_range) + if ((my_spaceship->waypoints[n].first - position) < max_range) { - if (!target || sf::length(position - my_spaceship->waypoints[n]) < sf::length(position - target->getPosition())) + if (!target || sf::length(position - my_spaceship->waypoints[n].first) < sf::length(position - target->getPosition())) { clear(); waypoint_selection_index = n; - waypoint_selection_position = my_spaceship->waypoints[n]; + waypoint_selection_position = my_spaceship->waypoints[n].first; return; } } @@ -97,7 +97,7 @@ int TargetsContainer::getWaypointIndex() waypoint_selection_index = -1; else if (waypoint_selection_index >= my_spaceship->getWaypointCount()) waypoint_selection_index = -1; - else if (my_spaceship->waypoints[waypoint_selection_index] != waypoint_selection_position) + else if (my_spaceship->waypoints[waypoint_selection_index].first != waypoint_selection_position) waypoint_selection_index = -1; return waypoint_selection_index; } @@ -106,5 +106,5 @@ void TargetsContainer::setWaypointIndex(int index) { waypoint_selection_index = index; if (my_spaceship && index >= 0 && index < (int)my_spaceship->waypoints.size()) - waypoint_selection_position = my_spaceship->waypoints[index]; + waypoint_selection_position = my_spaceship->waypoints[index].first; } diff --git a/src/screens/crew4/operationsScreen.cpp b/src/screens/crew4/operationsScreen.cpp index 940eb788ba..cc8b8e245b 100644 --- a/src/screens/crew4/operationsScreen.cpp +++ b/src/screens/crew4/operationsScreen.cpp @@ -31,7 +31,7 @@ OperationScreen::OperationScreen(GuiContainer* owner) { // ... and we select something near a waypoint, switch to move // waypoint mode. - if (sf::length(my_spaceship->waypoints[science->targets.getWaypointIndex()] - position) < 1000.0) + if (sf::length(my_spaceship->waypoints[science->targets.getWaypointIndex()].first - position) < 1000.0) { mode = MoveWaypoint; drag_waypoint_index = science->targets.getWaypointIndex(); diff --git a/src/screens/crew6/relayScreen.cpp b/src/screens/crew6/relayScreen.cpp index 23de128f0d..7f5e62a055 100644 --- a/src/screens/crew6/relayScreen.cpp +++ b/src/screens/crew6/relayScreen.cpp @@ -32,7 +32,7 @@ RelayScreen::RelayScreen(GuiContainer* owner, bool allow_comms) [this](sf::Vector2f position) { //down if (mode == TargetSelection && targets.getWaypointIndex() > -1 && my_spaceship) { - if (sf::length(my_spaceship->waypoints[targets.getWaypointIndex()] - position) < 1000.0) + if (sf::length(my_spaceship->waypoints[targets.getWaypointIndex()].first - position) < 1000.0) { mode = MoveWaypoint; drag_waypoint_index = targets.getWaypointIndex(); diff --git a/src/screens/crew6/scienceScreen.cpp b/src/screens/crew6/scienceScreen.cpp index 62c24ff366..2d760edcf1 100644 --- a/src/screens/crew6/scienceScreen.cpp +++ b/src/screens/crew6/scienceScreen.cpp @@ -430,7 +430,7 @@ void ScienceScreen::onDraw(sf::RenderTarget& window) else if (targets.getWaypointIndex() >= 0) { sidebar_pager->hide(); - sf::Vector2f position_diff = my_spaceship->waypoints[targets.getWaypointIndex()] - my_spaceship->getPosition(); + sf::Vector2f position_diff = my_spaceship->waypoints[targets.getWaypointIndex()].first - my_spaceship->getPosition(); float distance = sf::length(position_diff); float heading = sf::vector2ToAngle(position_diff) - 270; diff --git a/src/spaceObjects/playerSpaceship.cpp b/src/spaceObjects/playerSpaceship.cpp index d5af2bf557..95d5847d19 100644 --- a/src/spaceObjects/playerSpaceship.cpp +++ b/src/spaceObjects/playerSpaceship.cpp @@ -1539,8 +1539,23 @@ void PlayerSpaceship::onReceiveClientCommand(int32_t client_id, sf::Packet& pack { sf::Vector2f position; packet >> position; - if (waypoints.size() < 9) - waypoints.push_back(position); + if (waypoints.size() < max_waypoints) { + std::bitset taken_labels; + + for(const auto& waypoint: waypoints) { + taken_labels[waypoint.second-1] = true; + } + + uint8_t label = 0; + for(int n=0; n> index >> position; if (index >= 0 && index < int(waypoints.size())) - waypoints[index] = position; + waypoints[index].first = position; } break; case CMD_ACTIVATE_SELF_DESTRUCT: diff --git a/src/spaceObjects/playerSpaceship.h b/src/spaceObjects/playerSpaceship.h index 8fea72228c..826e5d6fa6 100644 --- a/src/spaceObjects/playerSpaceship.h +++ b/src/spaceObjects/playerSpaceship.h @@ -6,6 +6,7 @@ #include "commsScriptInterface.h" #include "playerInfo.h" #include +#include class ScanProbe; @@ -54,6 +55,9 @@ class PlayerSpaceship : public SpaceShip // Maximum number of self-destruction confirmation codes constexpr static int max_self_destruct_codes = 3; + // Maximum number of waypoints + constexpr static size_t max_waypoints = 9; + constexpr static int16_t CMD_PLAY_CLIENT_SOUND = 0x0001; // Content of a line in the ship's log @@ -115,10 +119,11 @@ class PlayerSpaceship : public SpaceShip CommsScriptInterface comms_script_interface; // Server only // Ship's log container std::vector ships_log; + public: std::vector custom_functions; - std::vector waypoints; + std::vector> waypoints; // Ship functionality // Capable of scanning a target @@ -328,7 +333,7 @@ class PlayerSpaceship : public SpaceShip // Waypoint functions int getWaypointCount() { return waypoints.size(); } - sf::Vector2f getWaypoint(int index) { if (index > 0 && index <= int(waypoints.size())) return waypoints[index - 1]; return sf::Vector2f(0, 0); } + sf::Vector2f getWaypoint(int index) { if (index > 0 && index <= int(waypoints.size())) return waypoints[index - 1].first; return sf::Vector2f(0, 0); } // Ship control code/password setter void setControlCode(string code) { control_code = code.upper(); }