[Change] Some shortcut key changes.
[Add] Launching after landing.
BIN
icons/blastoff.png
Normal file
After Width: | Height: | Size: 336 B |
Before Width: | Height: | Size: 371 B After Width: | Height: | Size: 361 B |
Before Width: | Height: | Size: 689 B After Width: | Height: | Size: 687 B |
Before Width: | Height: | Size: 250 B After Width: | Height: | Size: 243 B |
Before Width: | Height: | Size: 490 B After Width: | Height: | Size: 491 B |
Before Width: | Height: | Size: 460 B After Width: | Height: | Size: 466 B |
Before Width: | Height: | Size: 454 B After Width: | Height: | Size: 464 B |
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 438 B |
Before Width: | Height: | Size: 419 B After Width: | Height: | Size: 410 B |
128
src/player.cpp
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
59
src/ship.cpp
@ -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];
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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",
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|