[Change] Some shortcut key changes.

[Add] Launching after landing.
This commit is contained in:
Rtch90 2018-01-20 17:06:09 +00:00
parent 4abeef8f55
commit 625de2c655
16 changed files with 145 additions and 88 deletions

BIN
icons/blastoff.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

After

Width:  |  Height:  |  Size: 687 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 B

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 460 B

After

Width:  |  Height:  |  Size: 466 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 464 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 426 B

After

Width:  |  Height:  |  Size: 438 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 B

After

Width:  |  Height:  |  Size: 410 B

View File

@ -54,17 +54,19 @@ void Player::ApplyExternalViewRotation(matrix4x4d& m) {
}
void Player::TimeStepUpdate(const float timeStep) {
/* 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);
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);
}
}
polledControlsThisTurn = false;
Ship::TimeStepUpdate(timeStep);
@ -91,70 +93,68 @@ void Player::PollControls(void) {
m_external_view_dist = MAX(50, m_external_view_dist);
/* When landed don't let external view look from below. */
if(m_isLanded) m_external_view_rotx = CLAMP(m_external_view_rotx, -170.0, -10);
if(GetFlightState() == LANDED) m_external_view_rotx = CLAMP(m_external_view_rotx, -170.0, -10);
}
if((time_accel == 0) || GetDockedWith()) {
if((time_accel == 0) || GetDockedWith() ||
(GetFlightState() != FLYING)) {
return;
}
ClearThrusterState();
/* If flying. */
{
ClearThrusterState();
vector3f angThrust(0.0f);
vector3f angThrust(0.0f);
if(L3D::MouseButtonState(3)) {
float restitution = powf(MOUSE_RESTITUTION, L3D::GetTimeStep());
L3D::GetMouseMotion(mouseMotion);
m_mouseCMov[0] += mouseMotion[0];
m_mouseCMov[1] += mouseMotion[1];
m_mouseCMov[0] = CLAMP(m_mouseCMov[0]*restitution, -MOUSE_CTRL_AREA, MOUSE_CTRL_AREA);
m_mouseCMov[1] = CLAMP(m_mouseCMov[1]*restitution, -MOUSE_CTRL_AREA, MOUSE_CTRL_AREA);
angThrust.y = -m_mouseCMov[0] / MOUSE_CTRL_AREA;
angThrust.x = m_mouseCMov[1] / MOUSE_CTRL_AREA;
}
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);
if(L3D::KeyState(SDLK_x)) SetThrusterState(ShipType::THRUSTER_BOTTOM,1.0f);
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(3))) SetGunState(0, 1);
else SetGunState(0,0);
/* No torques at huge time accels -- ODE hates it. */
if(time_accel <= 10) {
if(L3D::GetCamType() != L3D::CAM_EXTERNAL) {
if(L3D::KeyState(SDLK_LEFT)) angThrust.y += 1;
if(L3D::KeyState(SDLK_RIGHT)) angThrust.y += -1;
if(L3D::KeyState(SDLK_UP)) angThrust.x += -1;
if(L3D::KeyState(SDLK_DOWN)) angThrust.x += 1;
if(L3D::MouseButtonState(3)) {
float restitution = powf(MOUSE_RESTITUTION, L3D::GetTimeStep());
L3D::GetMouseMotion(mouseMotion);
m_mouseCMov[0] += mouseMotion[0];
m_mouseCMov[1] += mouseMotion[1];
m_mouseCMov[0] = CLAMP(m_mouseCMov[0]*restitution, -MOUSE_CTRL_AREA, MOUSE_CTRL_AREA);
m_mouseCMov[1] = CLAMP(m_mouseCMov[1]*restitution, -MOUSE_CTRL_AREA, MOUSE_CTRL_AREA);
angThrust.y = -m_mouseCMov[0] / MOUSE_CTRL_AREA;
angThrust.x = m_mouseCMov[1] / MOUSE_CTRL_AREA;
}
/* Rotation damping. */
vector3d damping = CalcRotDamping();
angThrust.x -= damping.x;
angThrust.y -= damping.y;
angThrust.z -= damping.z;
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);
if(L3D::KeyState(SDLK_x)) SetThrusterState(ShipType::THRUSTER_BOTTOM, 1.0f);
if(L3D::KeyState(SDLK_a)) SetThrusterState(ShipType::THRUSTER_LEFT, 1.0f);
if(L3D::KeyState(SDLK_d)) SetThrusterState(ShipType::THRUSTER_RIGHT, 1.0f);
/*
* Divided by time step so controls don't go totally insane when
* used at 10x accel.
*/
angThrust *= 1.0f/ta2;
SetAngThrusterState(0, angThrust.x);
SetAngThrusterState(1, angThrust.y);
SetAngThrusterState(2, angThrust.z);
}
if(time_accel > 10) {
dBodySetAngularVel(m_body, 0, 0, 0);
}
if(L3D::KeyState(SDLK_SPACE) || (L3D::MouseButtonState(1) && L3D::MouseButtonState(1) && L3D::MouseButtonState(3))) SetGunState(0,1);
else SetGunState(0,0);
if(GetNavTarget() && L3D::KeyState(SDLK_END)) {
/* Temp test: Kill ("end") the target. */
Space::KillBody(GetNavTarget());
/* No torques at huge time accels -- ODE doesn't like it. */
if(time_accel <= 10) {
if(L3D::GetCamType() != L3D::CAM_EXTERNAL) {
if(L3D::KeyState(SDLK_LEFT)) angThrust.y += 1;
if(L3D::KeyState(SDLK_RIGHT)) angThrust.y += -1;
if(L3D::KeyState(SDLK_UP)) angThrust.x += -1;
if(L3D::KeyState(SDLK_DOWN)) angThrust.x += 1;
}
/* Rotation damping. */
vector3d damping = CalcRotDamping();
angThrust.x -= damping.x;
angThrust.y -= damping.y;
angThrust.z -= damping.z;
/*
* Dividing by time step so controls don't go insane when
* used at 10x accel.
*/
angThrust *= 1.0f/ta2;
SetAngThrusterState(0, angThrust.x);
SetAngThrusterState(1, angThrust.y);
SetAngThrusterState(2, angThrust.z);
}
if(time_accel > 10) {
dBodySetAngularVel(m_body, 0, 0, 0);
}
}
}

View File

@ -19,15 +19,15 @@ SectorView::SectorView(void) : GenericSystemView() {
Gui::ImageButton* ib = new Gui::ImageButton("icons/sectorview_f6_systeminfo.png");
ib->onClick.connect(sigc::mem_fun(this, &SectorView::OnClickSystemInfo));
ib->SetShortcut(SDLK_F6, KMOD_NONE);
ib->SetShortcut(SDLK_F5, KMOD_NONE);
m_rightButtonBar->Add(ib, 2, 2);
m_zoomInButton = new Gui::ImageButton("icons/zoom_in_f7.png");
m_zoomInButton->SetShortcut(SDLK_F7, KMOD_NONE);
m_zoomInButton->SetShortcut(SDLK_F6, KMOD_NONE);
m_rightButtonBar->Add(m_zoomInButton, 34, 2);
m_zoomOutButton = new Gui::ImageButton("icons/zoom_out_f8.png");
m_zoomOutButton->SetShortcut(SDLK_F8, KMOD_NONE);
m_zoomOutButton->SetShortcut(SDLK_F7, KMOD_NONE);
m_rightButtonBar->Add(m_zoomOutButton, 66, 2);
m_gluDiskDlist = glGenLists(1);

View File

@ -23,16 +23,17 @@ static ObjParams params = {
};
Ship::Ship(ShipType::Type shipType) : DynamicBody() {
m_isLanded = false;
m_testLanded = false;
m_wheelTransition = 0;
m_wheelState = 0;
m_dockedWith = 0;
dockingTimer = 0;
m_navTarget = 0;
m_combatTarget = 0;
m_shipType = shipType;
m_angThrusters[0] = m_angThrusters[1] = m_angThrusters[2] = 0;
m_flightState = FLYING;
m_testLanded = false;
m_launchLockTimeout = 0;
m_wheelTransition = 0;
m_wheelState = 0;
m_dockedWith = 0;
dockingTimer = 0;
m_navTarget = 0;
m_combatTarget = 0;
m_shipType = shipType;
m_angThrusters[0] = m_angThrusters[1] = m_angThrusters[2] = 0;
m_laserCollisionObj.owner = this;
m_equipment = EquipSet(shipType);
for(int i = 0; i < ShipType::GUNMOUNT_MAX; i++) {
@ -56,7 +57,8 @@ void Ship::UpdateMass(void) {
bool Ship::OnCollision(Body* b, Uint32 flags) {
if(b->GetType() == Object::PLANET) {
if(m_isLanded) return false;
/* Geoms still enabled when landed. */
if(m_flightState != FLYING) return false;
else m_testLanded = true;
}
return true;
@ -82,7 +84,9 @@ void Ship::ClearThrusterState(void) {
SetAngThrusterState(1, 0.0f);
SetAngThrusterState(2, 0.0f);
for(int i = 0; i < ShipType::THRUSTER_MAX; i++) m_thrusters[i] = 0;
if(m_launchLockTimeout == 0) {
for(int i = 0; i < ShipType::THRUSTER_MAX; i++) m_thrusters[i] = 0;
}
}
/* Hyperspace range is:
@ -107,13 +111,34 @@ void Ship::CalcStats(shipstats_t* stats) {
stats->hyperspace_range = 200 * hyperclass * hyperclass / stats->total_mass;
}
void Ship::Blastoff(void) {
if(m_flightState != LANDED) return;
ClearThrusterState();
m_flightState = FLYING;
m_testLanded = false;
m_dockedWith = 0;
m_launchLockTimeout = 1.0; /* One second of applying thrusters. */
Enable();
const double planetRadius = GetFrame()->m_astroBody->GetRadius();
vector3d up = vector3d::Normalize(GetPosition());
dBodySetLinearVel(m_body, 0, 0, 0);
dBodySetAngularVel(m_body, 0, 0, 0);
dBodySetForce(m_body, 0, 0, 0);
dBodySetTorque(m_body, 0, 0, 0);
SetPosition(up*planetRadius+10.0*up);
SetThrusterState(ShipType::THRUSTER_TOP, 1.0f);
}
void Ship::TestLanded(void) {
if(m_launchLockTimeout != 0) return;
if(GetFrame()->m_astroBody) {
const dReal* vel = dBodyGetLinearVel(m_body);
double speed = vector3d(vel[0], vel[1], vel[2]).Length();
const double planetRadius = GetFrame()->m_astroBody->GetRadius();
if(speed < 15) {
if(speed < 20) {
printf("Landed!\n");
/* Orient the damn thing right! */
@ -138,7 +163,7 @@ void Ship::TestLanded(void) {
*/
dBodyDisable(m_body);
ClearThrusterState();
m_isLanded = true;
m_flightState = LANDED;
m_testLanded = false;
}
}
@ -148,6 +173,10 @@ void Ship::TimeStepUpdate(const float timeStep) {
dockingTimer = (dockingTimer-timeStep > 0 ? dockingTimer-timeStep : 0);
/* ODE tri mesh likes to know our old position. */
TriMeshUpdateLastPos();
m_launchLockTimeout -= timeStep;
if(m_launchLockTimeout < 0) m_launchLockTimeout = 0;
const ShipType& stype = GetShipType();
for(int i = 0; i < ShipType::THRUSTER_MAX; i++) {
float force = timeStep * stype.linThrust[i] * m_thrusters[i];
@ -302,7 +331,7 @@ static void render_coll_mesh(const CollMesh* m) {
}
void Ship::Render(const Frame* camFrame) {
if((!dBodyIsEnabled(m_body)) && !m_isLanded) return;
if((!dBodyIsEnabled(m_body)) && !m_flightState) return;
const ShipType& stype = GetShipType();
params.angthrust[0] = m_angThrusters[0];
params.angthrust[1] = m_angThrusters[1];

View File

@ -34,11 +34,14 @@ public:
void UpdateMass(void);
vector3d CalcRotDamping();
void SetWheelState(bool down);
void Blastoff(void);
float GetDockingTimer(void) { return dockingTimer; }
void SetDockingTimer(float t) { dockingTimer = t; }
virtual void TimeStepUpdate(const float timeStep);
virtual void NotifyDeath(const Body* const dyingBody);
virtual bool OnCollision(Body* b, Uint32 flags);
enum FlightState { FLYING, LANDED };
FlightState GetFlightState(void) { return m_flightState; }
class LaserObj : public Object {
public:
@ -51,14 +54,15 @@ protected:
void RenderLaserfire(void);
SpaceStation* m_dockedWith;
bool m_isLanded;
enum ShipType::Type m_shipType;
Uint32 m_gunState[ShipType::GUNMOUNT_MAX];
private:
bool IsFiringLasers(void);
void TestLanded(void);
FlightState m_flightState;
bool m_testLanded;
float m_launchLockTimeout;
float m_wheelState;
float m_wheelTransition;

View File

@ -12,11 +12,11 @@ SystemView::SystemView(void): View() {
Add(m_timePoint, 24, 5);
m_zoomInButton = new Gui::ImageButton("icons/zoom_in_f7.png");
m_zoomInButton->SetShortcut(SDLK_F7, KMOD_NONE);
m_zoomInButton->SetShortcut(SDLK_F6, KMOD_NONE);
m_rightButtonBar->Add(m_zoomInButton, 34, 2);
m_zoomOutButton = new Gui::ImageButton("icons/zoom_out_f8.png");
m_zoomOutButton->SetShortcut(SDLK_F8, KMOD_NONE);
m_zoomOutButton->SetShortcut(SDLK_F7, KMOD_NONE);
m_rightButtonBar->Add(m_zoomOutButton, 66, 2);
Gui::ImageButton* b = new Gui::ImageButton("icons/sysview_accel_r3.png",

View File

@ -22,24 +22,33 @@ WorldView::WorldView(void): View() {
Add(commsOptions, 10, 20);
Gui::MultiStateImageButton* wheels_button = new Gui::MultiStateImageButton();
wheels_button->SetShortcut(SDLK_F7, KMOD_NONE);
wheels_button->SetShortcut(SDLK_F6, KMOD_NONE);
wheels_button->AddState(0, "icons/wheels_up.png");
wheels_button->AddState(1, "icons/wheels_down.png");
wheels_button->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeWheelsState));
m_rightButtonBar->Add(wheels_button, 34, 2);
Gui::MultiStateImageButton* labels_button = new Gui::MultiStateImageButton();
labels_button->SetShortcut(SDLK_9, KMOD_NONE);
labels_button->SetShortcut(SDLK_8, KMOD_NONE);
labels_button->AddState(1, "icons/labels_on.png");
labels_button->AddState(0, "icons/labels_off.png");
labels_button->onClick.connect(sigc::mem_fun(this, &WorldView::OnChangeLabelsState));
m_rightButtonBar->Add(labels_button, 98, 2);
m_hyperspaceButton = new Gui::ImageButton("icons/hyperspace_f8.png");
m_hyperspaceButton->SetShortcut(SDLK_F8, KMOD_NONE);
m_hyperspaceButton->SetShortcut(SDLK_F7, KMOD_NONE);
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->onClick.connect(sigc::mem_fun(this, &WorldView::OnClickBlastoff));
m_rightButtonBar->Add(launchButton, 2, 2);
flightStatus = new Gui::Label("");
flightStatus->SetColor(1, .7, 0);
m_rightRegion2->Add(flightStatus, 10, 3);
m_bgstarsDlist = glGenLists(1);
glNewList(m_bgstarsDlist, GL_COMPILE);
@ -70,6 +79,10 @@ void WorldView::OnChangeLabelsState(Gui::MultiStateImageButton* b) {
labelsOn = b->GetState();
}
void WorldView::OnClickBlastoff(void) {
L3D::player->Blastoff();
}
void WorldView::OnClickHyperspace(void) {
StarSystem* s = L3D::GetSelectedSystem();
if(s /* && isn's current system. */) {
@ -163,6 +176,14 @@ void WorldView::Update(void) {
} else {
//commsOptions->HideAll();
}
if(L3D::player->GetFlightState() == Ship::LANDED) {
flightStatus->SetText("Landed");
launchButton->Show();
} else {
flightStatus->SetText("Manual Controls");
launchButton->Hide();
}
}
Gui::Button* WorldView::AddCommsOption(std::string msg, int ypos) {

View File

@ -16,6 +16,7 @@ public:
private:
Gui::Button* AddCommsOption(const std::string msg, int ypos);
void OnClickHyperspace(void);
void OnClickBlastoff(void);
void OnChangeWheelsState(Gui::MultiStateImageButton* b);
void OnChangeLabelsState(Gui::MultiStateImageButton* b);
virtual bool OnMouseDown(Gui::MouseButtonEvent* e);
@ -23,6 +24,8 @@ private:
Gui::ImageButton* m_hyperspaceButton;
GLuint m_bgstarsDlist;
Gui::Fixed* commsOptions;
Gui::Label* flightStatus;
Gui::ImageButton* launchButton;
bool labelsOn;
};