From 27ad4c8450077635435d2a4dc329278cd4756ce4 Mon Sep 17 00:00:00 2001 From: Rtch90 Date: Sat, 14 Apr 2018 20:44:30 +0100 Subject: [PATCH] [Add] Very crappy autopilot. --- icons/autopilot.png | Bin 0 -> 715 bytes icons/manual_control.png | Bin 0 -> 300 bytes src/player.cpp | 29 ++++++++++++++++++ src/player.h | 7 +++++ src/ship.h | 2 +- src/world_view.cpp | 63 +++++++++++++++++++++++---------------- src/world_view.h | 18 ++++++----- 7 files changed, 85 insertions(+), 34 deletions(-) create mode 100644 icons/autopilot.png create mode 100644 icons/manual_control.png diff --git a/icons/autopilot.png b/icons/autopilot.png new file mode 100644 index 0000000000000000000000000000000000000000..156906b68f92674c835e09f30e0ed8f06b7971a8 GIT binary patch literal 715 zcmV;+0yO=JP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOY~ z5Cb}E73?|y000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0006eNkl4qX9D;Bk2vk$ z=S)%n82u*GSM5XiBmrJwYRSU^wzSt?oZF?J67gPx?lS0Zn?Qezwq>0cg3ZN z^YY&fmHE{&Zvbrj2z{;-hJq1RSu~9eFNZrj$MV=6gQ!*{nrJ8(G0hqGdJL^?VpkzY z(LG?IPbGg`SS;;?mR>B`BcAgw;40)yek;O8i*2rScY)0L7l>`H7$VS#U~_IY^0qnF x7IGDGmbq(3Xq(vXLhZ&i=eFxNSEq!{_7}Q@&Ss(Ee~AD9002ovPDHLkV1i#QIF|qb literal 0 HcmV?d00001 diff --git a/icons/manual_control.png b/icons/manual_control.png new file mode 100644 index 0000000000000000000000000000000000000000..62fd923fbb12b6d575b1cf1303fc7e36ccfa8435 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^azHG`!2~2D75(ej@)Wnk16ovB4 zk_-iRPv3y>Mm}+%qM4p9jv*GOlXEh&5*P3$BrT9!u<)YJkEPpnYuM7Ok9r5*yn6Ec zGWGkj?WC@KXqdNpisdAs`w9lLuDJB-OR1aYhEKfi{>(|DvUFa=)$3QT3K&S`vB+tE zjA*!=(ezAd^^q*ABFirQ*!z_g6L~Igl%5;@+;h)i&NhoGE=4r~#Zw%sQjUb4eo$m* qSmu1^T+{K`Eo-?>aHq~nFJTDRGdU2Hs51@dNCr<=KbLh*2~7a*pJ*Zg literal 0 HcmV?d00001 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(m_flightControlState)); +} + +void Player::Load(void) { + using namespace Serializer::Read; + Ship::Load(); + m_flightControlState = static_cast(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(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; };