[Add] Some work on ship equipment.

This commit is contained in:
Rtch90 2018-04-15 15:50:53 +01:00
parent 7b92a3fdf9
commit 13c6600e20
15 changed files with 174 additions and 22 deletions

View File

@ -33,6 +33,11 @@ void InfoView::UpdateInfo(void) {
stats->total_mass);
nfo += std::string(buf);
e = L3D::player->m_equipment.Get(Equip::SLOT_LASER, 0);
nfo += std::string("\n\nFront weapon: ")+EquipType::types[e].name;
e = L3D::player->m_equipment.Get(Equip::SLOT_LASER, 1);
nfo += std::string("\nRear weapon: ")+EquipType::types[e].name;
snprintf(buf, sizeof(buf), "\n\nHyperspace range: %.2f light years.", stats->hyperspace_range);
nfo += std::string(buf);

View File

@ -9,6 +9,7 @@ public:
void UpdateInfo(void);
virtual void Update(void);
virtual void Draw3D(void);
virtual void OnSwitchTo(void) { }
private:
Gui::Label* info1;
};

View File

@ -152,6 +152,7 @@ void L3D::SetMapView(enum MapView v) {
void L3D::SetView(View* v) {
if(currentView) currentView->HideAll();
currentView = v;
currentView->OnSwitchTo();
currentView->ShowAll();
}
@ -206,6 +207,7 @@ void L3D::HandleEvents(void) {
ship->SetLabel("A friend?");
ship->SetFrame(L3D::player->GetFrame());
ship->SetPosition(L3D::player->GetPosition()+100.0*dir);
ship->SetVelocity(L3D::player->GetVelocity());
Space::AddBody(ship);
}
}
@ -332,13 +334,14 @@ static void draw_intro(float _time) {
}
void L3D::Start(void) {
player = new Player(ShipType::SLEEK);
player->m_equipment.Set(Equip::SLOT_ENGINE, 0, Equip::DRIVE_CLASS1);
player->m_equipment.Set(Equip::SLOT_LASER, 0, Equip::LASER_2MW_BEAM);
player->m_equipment.Set(Equip::SLOT_LASER, 1, Equip::LASER_4MW_BEAM);
player->SetLabel("Me");
Space::AddBody(player);
cpan = new ShipCpanel();
cpan = new ShipCpanel();
sectorView = new SectorView();
systemView = new SystemView();
systemInfoView = new SystemInfoView();

View File

@ -10,6 +10,7 @@ public:
ObjectViewerView(void);
virtual void Update(void);
virtual void Draw3D(void);
virtual void OnSwitchTo(void) { }
private:
float viewingDist;
Gui::Label* m_infoLabel;

View File

@ -9,7 +9,6 @@
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();
}
@ -159,8 +158,13 @@ void Player::PollControls(void) {
if(L3D::KeyState(SDLK_a)) SetThrusterState(ShipType::THRUSTER_LEFT, 1.0f);
if(L3D::KeyState(SDLK_d)) SetThrusterState(ShipType::THRUSTER_RIGHT, 1.0f);
if(L3D::KeyState(SDLK_SPACE) || (L3D::MouseButtonState(1) && L3D::MouseButtonState(1) && L3D::MouseButtonState(3))) SetGunState(0,1);
else SetGunState(0,0);
if(L3D::KeyState(SDLK_SPACE) || (L3D::MouseButtonState(1) && L3D::MouseButtonState(3))) {
if(L3D::worldView->GetCamType() == WorldView::CAM_REAR) SetGunState(1,1);
else SetGunState(0,1);
} else {
SetGunState(0,0);
SetGunState(1,0);
}
if(L3D::worldView->GetCamType() != WorldView::CAM_EXTERNAL) {
if(L3D::KeyState(SDLK_LEFT)) angThrust.y += 1;
@ -260,6 +264,23 @@ void Player::DrawHUD(const Frame* cam_frame) {
glVertex2f(px, py+sz);
glVertex2f(px, py+0.5*sz);
glVertex2f(px, py+sz);
glVertex2f(px, py+0.5*sz);
glEnd();
} else if(L3D::worldView->GetCamType() == WorldView::CAM_REAR) {
float px = Gui::Screen::GetWidth()/2.0;
float py = Gui::Screen::GetHeight()/2.0;
const float sz = 0.5*HUD_CROSSHAIR_SIZE;
glBegin(GL_LINES);
glVertex2f(px-sz, py);
glVertex2f(px-0.5*sz, py);
glVertex2f(px+sz, py);
glVertex2f(px+0.5*sz, py);
glVertex2f(px, py-sz);
glVertex2f(px, py-0.5*sz);
glEnd();
}

View File

@ -16,6 +16,7 @@ public:
bool GetSelectedSystem(int* sector_x, int* sector_y, int* system_idx);
virtual void Save(void);
virtual void Load(void);
virtual void OnSwitchTo(void) { }
private:
void DrawSector(int x, int y);
void PutText(std::string& text);

View File

@ -44,7 +44,7 @@ void Ship::Save(void) {
wr_int((int)m_shipType);
wr_int(m_dockedWithPort);
wr_int(Serializer::LookupBody(m_dockedWith));
printf("TODO: NOT SAVING SHIP EQUIPMENT YET!!\n");
m_equipment.Save();
wr_float(m_stats.hull_mass_left);
wr_int(m_todo.size());
for(std::list<AIInstruction>::iterator i = m_todo.begin(); i != m_todo.end(); ++i) {
@ -80,8 +80,8 @@ void Ship::Load(void) {
m_shipType = (ShipType::Type)rd_int();
m_dockedWithPort = rd_int();
m_dockedWith = (SpaceStation*)rd_int();
/* TODO: */
m_equipment = EquipSet(m_shipType);
m_equipment.Load();
Init();
m_stats.hull_mass_left = rd_float(); /* Must be after Init();.. */
int num = rd_int();
@ -360,7 +360,9 @@ void Ship::TimeStepUpdate(const float timeStep) {
GetFrame()->GetCollisionSpace()->TraceRay(pos, dir, 10000.0, &c, GetGeom());
if(c.userData1) {
Body* hit = static_cast<Body*>(c.userData1);
hit->OnDamage(this, 1000.0);
Equip::Type t = m_equipment.Get(Equip::SLOT_LASER, i);
const float damage = 100.0 * EquipType::types[t].pval;
hit->OnDamage(this, damage);
}
}
@ -403,7 +405,9 @@ void Ship::SetDockedWith(SpaceStation* s, int port) {
}
void Ship::SetGunState(int idx, int state) {
m_gunState[idx] = state;
if(m_equipment.Get(Equip::SLOT_LASER, idx) != Equip::NONE) {
m_gunState[idx] = state;
}
}
bool Ship::SetWheelState(bool down) {
@ -437,7 +441,15 @@ void Ship::RenderLaserfire(void) {
for(int i = 0; i < ShipType::GUNMOUNT_MAX; i++) {
if(!m_gunState[i]) continue;
glPushAttrib(GL_CURRENT_BIT | GL_LINE_BIT);
glColor3f(1, 0, 0);
switch(m_equipment.Get(Equip::SLOT_LASER, i)) {
case Equip::LASER_2MW_BEAM:
glColor3f(1, .5, 0); break;
case Equip::LASER_4MW_BEAM:
glColor3f(1, 1, 0); break;
default:
case Equip::LASER_1MW_BEAM:
glColor3f(1, 0, 0); break;
}
glLineWidth(2.0f);
glBegin(GL_LINES);
vector3f pos = stype.gunMount[i].pos;

View File

@ -1,4 +1,5 @@
#include "ship_type.h"
#include "serializer.h"
const ShipType ShipType::types[] = {
{
@ -11,7 +12,7 @@ const ShipType ShipType::types[] = {
1e7,
{
{ vector3f(0, -0.5, 0), vector3f(0, 0, -1) },
{ vector3f(0, 0, 0), vector3f(0, 0, 1) }
{ vector3f(0, -0.5, 0), vector3f(0, 0, 1) }
},
{ 1, 2, 0 },
100, 20,
@ -65,6 +66,35 @@ const EquipType EquipType::types[] = {
"1MW beam laser",
Equip::SLOT_LASER,
1, 1
},
{
"2MW beam laser",
Equip::SLOT_LASER,
1, 2
},
{
"4MW beam laser",
Equip::SLOT_LASER,
1, 4
}
};
void EquipSet::Save(void) {
using namespace Serializer::Write;
for(int i = 0; i < Equip::SLOT_MAX; i++) {
for(unsigned int j = 0; j < equip[i].size(); j++) {
wr_int(static_cast<int>(equip[i][j]));
}
}
}
/* Should have initialised with EquipSet(ShipType::Type) first. */
void EquipSet::Load(void) {
using namespace Serializer::Read;
for(int i = 0; i < Equip::SLOT_MAX; i++) {
for(unsigned int j = 0; j < equip[i].size(); j++) {
equip[i][j] = static_cast<Equip::Type>(rd_int());
}
}
}

View File

@ -5,14 +5,15 @@
namespace Equip {
enum Slot { SLOT_ENGINE, SLOT_LASER, SLOT_MISSILE, SLOT_MAX };
enum Type { NONE, DRIVE_INTERPLANETARY, DRIVE_CLASS1, LASER_1MW_BEAM };
enum Type { NONE, DRIVE_INTERPLANETARY, DRIVE_CLASS1,
LASER_1MW_BEAM, LASER_2MW_BEAM, LASER_4MW_BEAM };
};
struct ShipType {
enum Thruster { THRUSTER_FRONT, THRUSTER_REAR, THRUSTER_TOP, THRUSTER_BOTTOM,
THRUSTER_LEFT, THRUSTER_RIGHT, THRUSTER_MAX };
enum Type { SLEEK, LADYBIRD, FLOWERFAIRY };
enum { GUNMOUNT_MAX = 2 };
enum { GUN_FRONT, GUN_REAR, GUNMOUNT_MAX = 2 };
/*******************************/
const char* name;
@ -48,6 +49,8 @@ public:
void Set(Equip::Slot s, int idx, Equip::Type e) {
equip[s][idx] = e;
}
void Save(void);
void Load(void);
private:
std::vector<Equip::Type> equip[Equip::SLOT_MAX];
};

View File

@ -3,7 +3,32 @@
#include "player.h"
#include "world_view.h"
SpaceStationView::SpaceStationView(void) : View() {
class StationSubView: public Gui::Fixed {
public:
StationSubView(SpaceStationView* parent): Gui::Fixed(Gui::Screen::GetWidth(), Gui::Screen::GetHeight()-64) {
m_parent = parent;
}
protected:
SpaceStationView* m_parent;
};
/**********************************************************/
class StationFrontView: public StationSubView {
public:
StationFrontView(SpaceStationView* parent);
private:
void OnClickRequestLaunch(void) {
L3D::player->SetDockedWith(0,0);
L3D::SetView(L3D::worldView);
}
void OnClickGotoShipYard(void) {
m_parent->GotoShipyard();
}
};
/**********************************************************/
StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(parent) {
SetTransparency(false);
Gui::Label* l = new Gui::Label("Hello friend! Thankyou for docking with this space station!\n"
@ -21,19 +46,59 @@ SpaceStationView::SpaceStationView(void) : View() {
Add(l, 40, size[1]-100);
Gui::SolidButton* b = new Gui::SolidButton();
b->onClick.connect(sigc::mem_fun(this, &SpaceStationView::OnClickRequestLaunch));
b->onClick.connect(sigc::mem_fun(this, &StationFrontView::OnClickRequestLaunch));
Add(b, 40, size[1]-300);
l = new Gui::Label("Request Launch");
Add(l, 65, size[1]-300);
l = new Gui::Label("Comms Link");
b = new Gui::SolidButton();
b->onClick.connect(sigc::mem_fun(this, &StationFrontView::OnClickGotoShipYard));
Add(b, 40, size[1]-360);
l = new Gui::Label("Shipyard");
Add(l, 65, size[1]-360);
}
/**********************************************************/
class StationShipyardView: public StationSubView {
public:
StationShipyardView(SpaceStationView* parent);
private:
};
StationShipyardView::StationShipyardView(SpaceStationView* parent): StationSubView(parent) {
SetTransparency(false);
}
/**********************************************************/
SpaceStationView::SpaceStationView(void): View() {
m_frontview = new StationFrontView(this);
m_shipyard = new StationShipyardView(this);
m_subview = 0;
SwitchView(m_frontview);
Gui::Label* l = new Gui::Label("Comms Link");
l->SetColor(1, .7, 0);
m_rightRegion2->Add(l, 10, 3);
}
void SpaceStationView::OnClickRequestLaunch(void) {
L3D::player->SetDockedWith(0,0);
L3D::SetView(L3D::worldView);
void SpaceStationView::SwitchView(StationSubView* v) {
if(m_subview) {
m_subview->HideAll();
Remove(m_subview);
}
m_subview = v;
Add(m_subview, 0, 0);
m_subview->ShowAll();
}
void SpaceStationView::GotoShipyard(void) {
SwitchView(m_shipyard);
}
void SpaceStationView::OnSwitchTo(void) {
SwitchView(m_frontview);
}
void SpaceStationView::Draw3D(void) {

View File

@ -3,12 +3,19 @@
#include "gui.h"
#include "view.h"
class StationSubView;
class SpaceStationView : public View {
public:
SpaceStationView(void);
virtual void Update(void);
virtual void Draw3D(void);
void GotoShipyard(void);
void SwitchView(StationSubView* v);
virtual void OnSwitchTo(void);
private:
void OnClickRequestLaunch(void);
StationSubView* m_subview,
*m_frontview,
*m_shipyard;
};

View File

@ -10,6 +10,7 @@ public:
SystemInfoView(void);
virtual void Update(void);
virtual void Draw3D(void);
virtual void OnSwitchTo(void) { };
private:
void SystemChanged(StarSystem* s);
void OnBodySelected(StarSystem::SBody* b);

View File

@ -10,7 +10,7 @@ public:
virtual ~SystemView(void);
virtual void Update(void);
virtual void Draw3D(void);
virtual void OnSwitchTo(void) { }
private:
void PutOrbit(StarSystem::SBody* b);
void PutBody(StarSystem::SBody* b);

View File

@ -39,6 +39,7 @@
virtual void Update(void) = 0;
virtual void Save(void) { }
virtual void Load(void) { }
virtual void OnSwitchTo() = 0;
protected:
/* Each view can put some buttons in the bottom right of the cpanel. */
Gui::Fixed* m_rightButtonBar;

View File

@ -10,6 +10,7 @@ public:
WorldView(void);
virtual void Update(void);
virtual void Draw3D(void);
virtual void OnSwitchTo(void) { }
static const float PICK_OBJECT_RECT_SIZE;
void UpdateCommsOptions(void);
bool GetShowLabels(void) { return m_labelsOn; }