From 3cbc228cfe61f0c1bc573d34ceab258b65e4dca3 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sat, 14 Apr 2018 23:08:19 +0100 Subject: [PATCH] [Add] Set speed control mode. --- src/player.cpp | 64 ++++++++++++++++++++++++++++++++++++---------- src/player.h | 3 ++- src/world_view.cpp | 14 +++++++--- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/player.cpp b/src/player.cpp index b8861ff..d30254c 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -23,12 +23,14 @@ void Player::Save(void) { using namespace Serializer::Write; Ship::Save(); wr_int(static_cast(m_flightControlState)); + wr_float(m_setSpeed); } void Player::Load(void) { using namespace Serializer::Read; Ship::Load(); m_flightControlState = static_cast(rd_int()); + m_setSpeed = rd_float(); } void Player::SetFlightControlState(enum FlightControlState s) { @@ -41,6 +43,9 @@ void Player::SetFlightControlState(enum FlightControlState s) { } else if(target) { AIInstruct(Ship::DO_KILL, target); } + } else if(m_flightControlState == CONTROL_FIXSPEED) { + AIClearInstructions(); + m_setSpeed = GetVelocity().Length(); } else { AIClearInstructions(); } @@ -65,21 +70,35 @@ void Player::SetDockedWith(SpaceStation* s, int port) { } void Player::TimeStepUpdate(const float timeStep) { - if(GetFlightState() == Ship::FLYING) { - /* When world view not selected. */ - if(!polledControlsThisTurn) { - const float time_accel = L3D::GetTimeAccel(); - const float ta2 = time_accel*time_accel; - ClearThrusterState(); - /* Still must apply rotation damping. */ - vector3d damping = CalcRotDamping(); - damping *= 1.0f/ta2; - SetAngThrusterState(0, -damping.x); - SetAngThrusterState(1, -damping.y); - SetAngThrusterState(2, -damping.z); - } - } + ClearThrusterState(); polledControlsThisTurn = false; + if(L3D::GetView() == L3D::worldView) PollControls(); + + if(GetFlightState() == Ship::FLYING) { + switch(m_flightControlState) { + case CONTROL_MANUAL: + /* When world view not selected. */ + if(!polledControlsThisTurn) { + const float time_accel = L3D::GetTimeAccel(); + const float ta2 = time_accel*time_accel; + /* We still must apply rotation damping. */ + vector3d damping = CalcRotDamping(); + damping *= 1.0f/ta2; + SetAngThrusterState(0, -damping.x); + SetAngThrusterState(1, -damping.y); + SetAngThrusterState(2, -damping.z); + } + break; + case CONTROL_FIXSPEED: + AIAccelToModelRelativeVelocity(vector3d(0,0,-m_setSpeed)); + break; + case CONTROL_AUTOPILOT: + break; + } + } else { + m_flightControlState = CONTROL_MANUAL; + AIClearInstructions(); + } Ship::TimeStepUpdate(timeStep); } @@ -129,6 +148,10 @@ void Player::PollControls(void) { angThrust.x = m_mouseCMov[1] / MOUSE_CTRL_AREA; } + if(m_flightControlState == CONTROL_FIXSPEED) { + if(L3D::KeyState(SDLK_RETURN)) m_setSpeed += MAX(m_setSpeed*0.05, 1.0); + if(L3D::KeyState(SDLK_RSHIFT)) m_setSpeed -= MAX(m_setSpeed*0.05, 1.0); + } if(L3D::KeyState(SDLK_w)) SetThrusterState(ShipType::THRUSTER_REAR, 1.0f); if(L3D::KeyState(SDLK_s)) SetThrusterState(ShipType::THRUSTER_FRONT, 1.0f); if(L3D::KeyState(SDLK_2)) SetThrusterState(ShipType::THRUSTER_TOP, 1.0f); @@ -271,6 +294,19 @@ void Player::DrawHUD(const Frame* cam_frame) { glPopMatrix(); } + if(m_flightControlState == CONTROL_FIXSPEED) { + char buf[128]; + if(m_setSpeed > 1000) { + snprintf(buf, sizeof(buf), "Set speed %.2f km/s", m_setSpeed*0.001); + } else { + snprintf(buf, sizeof(buf), "Set speed %.0f m/s", m_setSpeed); + } + glPushMatrix(); + glTranslatef(200, 66, 0); + Gui::Screen::RenderString(buf); + glPopMatrix(); + } + /* Altitude. */ if(GetFrame()->m_astroBody) { double radius = GetFrame()->m_astroBody->GetRadius(); diff --git a/src/player.h b/src/player.h index 66713f2..1e5293d 100644 --- a/src/player.h +++ b/src/player.h @@ -13,7 +13,7 @@ public: void DrawHUD(const Frame* cam_frame); virtual void SetDockedWith(SpaceStation*, int port); void TimeStepUpdate(const float timeStep); - enum FlightControlState { CONTROL_MANUAL, CONTROL_AUTOPILOT }; + enum FlightControlState { CONTROL_MANUAL, CONTROL_FIXSPEED, CONTROL_AUTOPILOT }; FlightControlState GetFlightControlState(void) const { return m_flightControlState; } void SetFlightControlState(FlightControlState s); protected: @@ -25,5 +25,6 @@ private: float m_mouseCMov[2]; bool polledControlsThisTurn; enum FlightControlState m_flightControlState; + float m_setSpeed; }; diff --git a/src/world_view.cpp b/src/world_view.cpp index 38d619d..08735f5 100644 --- a/src/world_view.cpp +++ b/src/world_view.cpp @@ -54,6 +54,7 @@ WorldView::WorldView(void): View() { m_flightControlButton = new Gui::MultiStateImageButton(); m_flightControlButton->SetShortcut(SDLK_F5, KMOD_NONE); m_flightControlButton->AddState(Player::CONTROL_MANUAL, "icons/manual_control.png", "Manual control."); + m_flightControlButton->AddState(Player::CONTROL_FIXSPEED, "icons/manual_control.png", "Computer speed control."); m_flightControlButton->AddState(Player::CONTROL_AUTOPILOT, "icons/autopilot.png", "Autopilot on."); m_flightControlButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeFlightState)); m_rightButtonBar->Add(m_flightControlButton, 2, 2); @@ -223,9 +224,6 @@ void WorldView::Update(void) { } else { m_hyperspaceButton->Hide(); } - /* Player control inputs. */ - if(L3D::player) - L3D::player->PollControls(); Body* target = L3D::player->GetNavTarget(); if(target) { @@ -239,7 +237,15 @@ void WorldView::Update(void) { m_launchButton->Show(); m_flightControlButton->Hide(); } else { - m_flightStatus->SetText("Manual Controls"); + Player::FlightControlState fstate = L3D::player->GetFlightControlState(); + switch(fstate) { + case Player::CONTROL_MANUAL: + m_flightStatus->SetText("Manual Control"); break; + case Player::CONTROL_FIXSPEED: + m_flightStatus->SetText("Speed Control"); break; + case Player::CONTROL_AUTOPILOT: + m_flightStatus->SetText("Autopilot"); break; + } m_launchButton->Hide(); m_flightControlButton->Show(); }