diff --git a/icons/autopilot.png b/icons/autopilot.png new file mode 100644 index 0000000..156906b Binary files /dev/null and b/icons/autopilot.png differ diff --git a/icons/manual_control.png b/icons/manual_control.png new file mode 100644 index 0000000..62fd923 Binary files /dev/null and b/icons/manual_control.png differ diff --git a/src/player.cpp b/src/player.cpp index 109ad3c..b8861ff 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -5,10 +5,12 @@ #include "gui.h" #include "world_view.h" #include "space_station_view.h" +#include "serializer.h" Player::Player(ShipType::Type shipType) : Ship(shipType) { m_mouseCMov[0] = m_mouseCMov[1] = 0; m_equipment.Set(Equip::SLOT_ENGINE, 0, Equip::DRIVE_CLASS1); + m_flightControlState = CONTROL_MANUAL; UpdateMass(); } @@ -17,6 +19,33 @@ Player::~Player(void) { L3D::player = 0; } +void Player::Save(void) { + using namespace Serializer::Write; + Ship::Save(); + wr_int(static_cast<int>(m_flightControlState)); +} + +void Player::Load(void) { + using namespace Serializer::Read; + Ship::Load(); + m_flightControlState = static_cast<FlightControlState>(rd_int()); +} + +void Player::SetFlightControlState(enum FlightControlState s) { + m_flightControlState = s; + if(m_flightControlState == CONTROL_AUTOPILOT) { + Body* target = GetNavTarget(); + AIClearInstructions(); + if(target && target->IsType(Object::SHIP)) { + AIInstruct(Ship::DO_KILL, target); + } else if(target) { + AIInstruct(Ship::DO_KILL, target); + } + } else { + AIClearInstructions(); + } +} + void Player::Render(const Frame* camFrame) { if(L3D::worldView->GetCamType() == WorldView::CAM_EXTERNAL) { Ship::Render(camFrame); diff --git a/src/player.h b/src/player.h index 248d7a8..66713f2 100644 --- a/src/player.h +++ b/src/player.h @@ -13,10 +13,17 @@ public: void DrawHUD(const Frame* cam_frame); virtual void SetDockedWith(SpaceStation*, int port); void TimeStepUpdate(const float timeStep); + enum FlightControlState { CONTROL_MANUAL, CONTROL_AUTOPILOT }; + FlightControlState GetFlightControlState(void) const { return m_flightControlState; } + void SetFlightControlState(FlightControlState s); +protected: + virtual void Save(void); + virtual void Load(void); private: void DrawTargetSquares(); void DrawTargetSquare(const Body* const target); float m_mouseCMov[2]; bool polledControlsThisTurn; + enum FlightControlState m_flightControlState; }; diff --git a/src/ship.h b/src/ship.h index 4b6dec1..d1ba0c0 100644 --- a/src/ship.h +++ b/src/ship.h @@ -53,7 +53,7 @@ public: enum AICommand { DO_NOTHING, DO_KILL }; void AIInstruct(enum AICommand, void* arg); - void AiClearInstruction(void) { m_todo.clear(); } + void AIClearInstructions(void) { m_todo.clear(); } virtual void PostLoadFixup(void); protected: virtual void Save(void); diff --git a/src/world_view.cpp b/src/world_view.cpp index 57b182a..38d619d 100644 --- a/src/world_view.cpp +++ b/src/world_view.cpp @@ -15,15 +15,15 @@ WorldView::WorldView(void): View() { float size[2]; GetSize(size); - labelsOn = true; + m_labelsOn = true; m_camType = CAM_FRONT; SetTransparency(true); m_externalViewRotX = m_externalViewRotY = 0; m_externalViewDist = 200; - commsOptions = new Fixed(size[0], size[1]/2); - commsOptions->SetTransparency(true); - Add(commsOptions, 10, 20); + m_commsOptions = new Fixed(size[0], size[1]/2); + m_commsOptions->SetTransparency(true); + Add(m_commsOptions, 10, 20); Gui::MultiStateImageButton* wheels_button = new Gui::MultiStateImageButton(); wheels_button->SetShortcut(SDLK_F6, KMOD_NONE); @@ -45,15 +45,22 @@ WorldView::WorldView(void): View() { m_hyperspaceButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnClickHyperspace)); m_rightButtonBar->Add(m_hyperspaceButton, 66, 2); - launchButton = new Gui::ImageButton("icons/blastoff.png"); - launchButton->SetShortcut(SDLK_F5, KMOD_NONE); - launchButton->SetToolTip("Takeoff"); - launchButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnClickBlastoff)); - m_rightButtonBar->Add(launchButton, 2, 2); + m_launchButton = new Gui::ImageButton("icons/blastoff.png"); + m_launchButton->SetShortcut(SDLK_F5, KMOD_NONE); + m_launchButton->SetToolTip("Takeoff"); + m_launchButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnClickBlastoff)); + m_rightButtonBar->Add(m_launchButton, 2, 2); - flightStatus = new Gui::Label(""); - flightStatus->SetColor(1, .7, 0); - m_rightRegion2->Add(flightStatus, 10, 3); + 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_AUTOPILOT, "icons/autopilot.png", "Autopilot on."); + m_flightControlButton->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeFlightState)); + m_rightButtonBar->Add(m_flightControlButton, 2, 2); + + m_flightStatus = new Gui::Label(""); + m_flightStatus->SetColor(1, .7, 0); + m_rightRegion2->Add(m_flightStatus, 10, 3); m_bgstarsDlist = glGenLists(1); @@ -118,8 +125,12 @@ void WorldView::OnChangeWheelsState(Gui::MultiStateImageButton* b) { } } +void WorldView::OnChangeFlightState(Gui::MultiStateImageButton* b) { + L3D::player->SetFlightControlState(static_cast<Player::FlightControlState>(b->GetState())); +} + void WorldView::OnChangeLabelsState(Gui::MultiStateImageButton* b) { - labelsOn = b->GetState(); + m_labelsOn = b->GetState(); } void WorldView::OnClickBlastoff(void) { @@ -218,26 +229,28 @@ void WorldView::Update(void) { Body* target = L3D::player->GetNavTarget(); if(target) { - commsOptions->ShowAll(); + m_commsOptions->ShowAll(); } else { - //commsOptions->HideAll(); + //m_commsOptions->HideAll(); } if(L3D::player->GetFlightState() == Ship::LANDED) { - flightStatus->SetText("Landed"); - launchButton->Show(); + m_flightStatus->SetText("Landed"); + m_launchButton->Show(); + m_flightControlButton->Hide(); } else { - flightStatus->SetText("Manual Controls"); - launchButton->Hide(); + m_flightStatus->SetText("Manual Controls"); + m_launchButton->Hide(); + m_flightControlButton->Show(); } } Gui::Button* WorldView::AddCommsOption(std::string msg, int ypos) { Gui::Label* l = new Gui::Label(msg); - commsOptions->Add(l, 50, ypos); + m_commsOptions->Add(l, 50, ypos); Gui::TransparentButton* b = new Gui::TransparentButton(); - commsOptions->Add(b, 16, ypos); + m_commsOptions->Add(b, 16, ypos); return b; } @@ -248,20 +261,20 @@ static void PlayerRequestDockingClearance(SpaceStation* s) { void WorldView::UpdateCommsOptions(void) { Body* const navtarget = L3D::player->GetNavTarget(); - commsOptions->DeleteAllChildren(); + m_commsOptions->DeleteAllChildren(); float size[2]; - commsOptions->GetSize(size); + m_commsOptions->GetSize(size); int ypos = size[1]-16; if(navtarget) { if(navtarget->IsType(Object::SPACESTATION)) { - commsOptions->Add(new Gui::Label(navtarget->GetLabel()), 16, ypos); + m_commsOptions->Add(new Gui::Label(navtarget->GetLabel()), 16, ypos); ypos -= 32; Gui::Button* b = AddCommsOption("Request docking clearance", ypos); b->onClick.connect(sigc::bind(sigc::ptr_fun(&PlayerRequestDockingClearance), (SpaceStation*)navtarget)); ypos -= 32; } else { - commsOptions->Add(new Gui::Label(navtarget->GetLabel()), 16, ypos); + m_commsOptions->Add(new Gui::Label(navtarget->GetLabel()), 16, ypos); ypos -= 32; std::string msg = "Do something to "+navtarget->GetLabel(); Gui::Button* b = AddCommsOption(msg, ypos); diff --git a/src/world_view.h b/src/world_view.h index c90a05f..e8b252f 100644 --- a/src/world_view.h +++ b/src/world_view.h @@ -12,7 +12,7 @@ public: virtual void Draw3D(void); static const float PICK_OBJECT_RECT_SIZE; void UpdateCommsOptions(void); - bool GetShowLabels(void) { return labelsOn; } + bool GetShowLabels(void) { return m_labelsOn; } void DrawBgStars(void); vector3d GetExternalViewTranslation(void); void ApplyExternalViewRotation(matrix4x4d& m); @@ -30,14 +30,16 @@ private: void OnClickBlastoff(void); void OnChangeWheelsState(Gui::MultiStateImageButton* b); void OnChangeLabelsState(Gui::MultiStateImageButton* b); + void OnChangeFlightState(Gui::MultiStateImageButton* b); virtual bool OnMouseDown(Gui::MouseButtonEvent* e); Body* PickBody(const float screenX, const float screenY) const; - Gui::ImageButton* m_hyperspaceButton; - GLuint m_bgstarsDlist; - Gui::Fixed* commsOptions; - Gui::Label* flightStatus; - Gui::ImageButton* launchButton; - bool labelsOn; - enum CamType m_camType; + Gui::ImageButton* m_hyperspaceButton; + GLuint m_bgstarsDlist; + Gui::Fixed* m_commsOptions; + Gui::Label* m_flightStatus; + Gui::ImageButton* m_launchButton; + Gui::MultiStateImageButton* m_flightControlButton; + bool m_labelsOn; + enum CamType m_camType; };