summaryrefslogtreecommitdiffhomepage
path: root/Stars45/FlightComp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Stars45/FlightComp.cpp')
-rw-r--r--Stars45/FlightComp.cpp498
1 files changed, 249 insertions, 249 deletions
diff --git a/Stars45/FlightComp.cpp b/Stars45/FlightComp.cpp
index 02b7b39..9f2da13 100644
--- a/Stars45/FlightComp.cpp
+++ b/Stars45/FlightComp.cpp
@@ -1,15 +1,15 @@
/* Project Starshatter 4.5
- Destroyer Studios LLC
- Copyright © 1997-2004. All Rights Reserved.
+ Destroyer Studios LLC
+ Copyright © 1997-2004. All Rights Reserved.
- SUBSYSTEM: Stars.exe
- FILE: FlightComp.cpp
- AUTHOR: John DiCamillo
+ SUBSYSTEM: Stars.exe
+ FILE: FlightComp.cpp
+ AUTHOR: John DiCamillo
- OVERVIEW
- ========
- Flight Computer System class
+ OVERVIEW
+ ========
+ Flight Computer System class
*/
#include "MemDebug.h"
@@ -21,17 +21,17 @@
// +----------------------------------------------------------------------+
FlightComp::FlightComp(int comp_type, const char* comp_name)
- : Computer(comp_type, comp_name), mode(0), vlimit(0.0f),
- trans_x_limit(0.0f), trans_y_limit(0.0f), trans_z_limit(0.0f),
- throttle(0.0f), halt(0)
+: Computer(comp_type, comp_name), mode(0), vlimit(0.0f),
+trans_x_limit(0.0f), trans_y_limit(0.0f), trans_z_limit(0.0f),
+throttle(0.0f), halt(0)
{ }
// +----------------------------------------------------------------------+
FlightComp::FlightComp(const Computer& c)
- : Computer(c), mode(0), vlimit(0.0f),
- trans_x_limit(0.0f), trans_y_limit(0.0f), trans_z_limit(0.0f),
- throttle(0.0f), halt(0)
+: Computer(c), mode(0), vlimit(0.0f),
+trans_x_limit(0.0f), trans_y_limit(0.0f), trans_z_limit(0.0f),
+throttle(0.0f), halt(0)
{ }
// +--------------------------------------------------------------------+
@@ -44,13 +44,13 @@ FlightComp::~FlightComp()
void
FlightComp::SetTransLimit(double x, double y, double z)
{
- trans_x_limit = 0.0f;
- trans_y_limit = 0.0f;
- trans_z_limit = 0.0f;
+ trans_x_limit = 0.0f;
+ trans_y_limit = 0.0f;
+ trans_z_limit = 0.0f;
- if (x >= 0) trans_x_limit = (float) x;
- if (y >= 0) trans_y_limit = (float) y;
- if (z >= 0) trans_z_limit = (float) z;
+ if (x >= 0) trans_x_limit = (float) x;
+ if (y >= 0) trans_y_limit = (float) y;
+ if (z >= 0) trans_z_limit = (float) z;
}
// +--------------------------------------------------------------------+
@@ -58,10 +58,10 @@ FlightComp::SetTransLimit(double x, double y, double z)
void
FlightComp::ExecSubFrame()
{
- if (ship) {
- ExecThrottle();
- ExecTrans();
- }
+ if (ship) {
+ ExecThrottle();
+ ExecTrans();
+ }
}
// +--------------------------------------------------------------------+
@@ -69,10 +69,10 @@ FlightComp::ExecSubFrame()
void
FlightComp::ExecThrottle()
{
- throttle = (float) ship->Throttle();
+ throttle = (float) ship->Throttle();
- if (throttle > 5)
- halt = false;
+ if (throttle > 5)
+ halt = false;
}
// +--------------------------------------------------------------------+
@@ -80,226 +80,226 @@ FlightComp::ExecThrottle()
void
FlightComp::ExecTrans()
{
- double tx = ship->TransX();
- double ty = ship->TransY();
- double tz = ship->TransZ();
-
- double trans_x = tx;
- double trans_y = ty;
- double trans_z = tz;
-
- bool flcs_operative = false;
-
- if (IsPowerOn())
- flcs_operative = Status() == System::NOMINAL ||
- Status() == System::DEGRADED;
-
- // ----------------------------------------------------------
- // FIGHTER FLCS AUTO MODE
- // ----------------------------------------------------------
-
- if (mode == Ship::FLCS_AUTO) {
- // auto thrust to align flight path with orientation:
- if (tx == 0) {
- if (flcs_operative)
- trans_x = (ship->Velocity() * ship->BeamLine() * -200);
-
- else
- trans_x = 0;
- }
-
- // manual thrust up to vlimit/2:
- else {
- double vfwd = ship->BeamLine() * ship->Velocity();
-
- if (fabs(vfwd)>= vlimit) {
- if (trans_x > 0 && vfwd > 0)
- trans_x = 0;
-
- else if (trans_x < 0 && vfwd < 0)
- trans_x = 0;
- }
- }
-
- if (halt && flcs_operative) {
- if (ty == 0) {
- double vfwd = ship->Heading() * ship->Velocity();
- double vmag = fabs(vfwd);
-
- if (vmag > 0) {
- if (vfwd > 0)
- trans_y = -trans_y_limit;
- else
- trans_y = trans_y_limit;
-
- if (vfwd < vlimit/2)
- trans_y *= (vmag/(vlimit/2));
- }
- }
- }
-
-
- // auto thrust to align flight path with orientation:
- if (tz == 0) {
- if (flcs_operative)
- trans_z = (ship->Velocity() * ship->LiftLine() * -200);
-
- else
- trans_z = 0;
- }
-
- // manual thrust up to vlimit/2:
- else {
- double vfwd = ship->LiftLine() * ship->Velocity();
-
- if (fabs(vfwd) >= vlimit) {
- if (trans_z > 0 && vfwd > 0)
- trans_z = 0;
-
- else if (trans_z < 0 && vfwd < 0)
- trans_z = 0;
- }
- }
- }
-
- // ----------------------------------------------------------
- // STARSHIP HELM MODE
- // ----------------------------------------------------------
-
- else if (mode == Ship::FLCS_HELM) {
- if (flcs_operative) {
- double compass_heading = ship->CompassHeading();
- double compass_pitch = ship->CompassPitch();
- // rotate helm into compass orientation:
- double helm = ship->GetHelmHeading() - compass_heading;
-
- if (helm > PI)
- helm -= 2*PI;
- else if (helm < -PI)
- helm += 2*PI;
-
- // turn to align with helm heading:
- if (helm != 0)
- ship->ApplyYaw(helm);
-
- // pitch to align with helm pitch:
- if (compass_pitch != ship->GetHelmPitch())
- ship->ApplyPitch(compass_pitch - ship->GetHelmPitch());
-
- // roll to align with world coordinates:
- if (ship->Design()->auto_roll > 0) {
- Point vrt = ship->Cam().vrt();
- double deflection = vrt.y;
-
- if (fabs(helm) < PI/16 || ship->Design()->turn_bank < 0.01) {
- if (ship->Design()->auto_roll > 1) {
- ship->ApplyRoll(0.5);
- }
- else if (deflection != 0) {
- double theta = asin(deflection);
- ship->ApplyRoll(-theta);
- }
- }
-
- // else roll through turn maneuvers:
- else {
- double desired_bank = ship->Design()->turn_bank;
-
- if (helm >= 0)
- desired_bank = -desired_bank;
-
- double current_bank = asin(deflection);
- double theta = desired_bank - current_bank;
- ship->ApplyRoll(theta);
-
- // coordinate the turn:
- if (current_bank < 0 && desired_bank < 0 ||
- current_bank > 0 && desired_bank > 0) {
-
- double coord_pitch = compass_pitch
- - ship->GetHelmPitch()
- - fabs(helm) * fabs(current_bank);
- ship->ApplyPitch(coord_pitch);
- }
- }
- }
- }
-
- // flcs inoperative, set helm heading based on actual compass heading:
- else {
- ship->SetHelmHeading(ship->CompassHeading());
- ship->SetHelmPitch(ship->CompassPitch());
- }
-
- // auto thrust to align flight path with helm order:
- if (tx == 0) {
- if (flcs_operative)
- trans_x = (ship->Velocity() * ship->BeamLine() * ship->Mass() * -1);
-
- else
- trans_x = 0;
- }
-
- // manual thrust up to vlimit/2:
- else {
- double vfwd = ship->BeamLine() * ship->Velocity();
-
- if (fabs(vfwd) >= vlimit/2) {
- if (trans_x > 0 && vfwd > 0)
- trans_x = 0;
-
- else if (trans_x < 0 && vfwd < 0)
- trans_x = 0;
- }
- }
-
- if (trans_y == 0 && halt) {
- double vfwd = ship->Heading() * ship->Velocity();
- double vdesired = 0;
-
- if (vfwd > vdesired) {
- trans_y = -trans_y_limit;
-
- if (!flcs_operative)
- trans_y = 0;
-
- double vdelta = vfwd-vdesired;
- if (vdelta < vlimit/2)
- trans_y *= (vdelta/(vlimit/2));
- }
- }
-
-
-
- // auto thrust to align flight path with helm order:
- if (tz == 0) {
- if (flcs_operative)
- trans_z = (ship->Velocity() * ship->LiftLine() * ship->Mass() * -1);
-
- else
- trans_z = 0;
- }
-
- // manual thrust up to vlimit/2:
- else {
- double vfwd = ship->LiftLine() * ship->Velocity();
-
- if (fabs(vfwd) > vlimit/2) {
- if (trans_z > 0 && vfwd > 0)
- trans_z = 0;
-
- else if (trans_z < 0 && vfwd < 0)
- trans_z = 0;
- }
- }
- }
-
- if (ship->GetThruster()) {
- ship->GetThruster()->ExecTrans(trans_x, trans_y, trans_z);
- }
- else {
- ship->SetTransX(trans_x);
- ship->SetTransY(trans_y);
- ship->SetTransZ(trans_z);
- }
+ double tx = ship->TransX();
+ double ty = ship->TransY();
+ double tz = ship->TransZ();
+
+ double trans_x = tx;
+ double trans_y = ty;
+ double trans_z = tz;
+
+ bool flcs_operative = false;
+
+ if (IsPowerOn())
+ flcs_operative = Status() == System::NOMINAL ||
+ Status() == System::DEGRADED;
+
+ // ----------------------------------------------------------
+ // FIGHTER FLCS AUTO MODE
+ // ----------------------------------------------------------
+
+ if (mode == Ship::FLCS_AUTO) {
+ // auto thrust to align flight path with orientation:
+ if (tx == 0) {
+ if (flcs_operative)
+ trans_x = (ship->Velocity() * ship->BeamLine() * -200);
+
+ else
+ trans_x = 0;
+ }
+
+ // manual thrust up to vlimit/2:
+ else {
+ double vfwd = ship->BeamLine() * ship->Velocity();
+
+ if (fabs(vfwd)>= vlimit) {
+ if (trans_x > 0 && vfwd > 0)
+ trans_x = 0;
+
+ else if (trans_x < 0 && vfwd < 0)
+ trans_x = 0;
+ }
+ }
+
+ if (halt && flcs_operative) {
+ if (ty == 0) {
+ double vfwd = ship->Heading() * ship->Velocity();
+ double vmag = fabs(vfwd);
+
+ if (vmag > 0) {
+ if (vfwd > 0)
+ trans_y = -trans_y_limit;
+ else
+ trans_y = trans_y_limit;
+
+ if (vfwd < vlimit/2)
+ trans_y *= (vmag/(vlimit/2));
+ }
+ }
+ }
+
+
+ // auto thrust to align flight path with orientation:
+ if (tz == 0) {
+ if (flcs_operative)
+ trans_z = (ship->Velocity() * ship->LiftLine() * -200);
+
+ else
+ trans_z = 0;
+ }
+
+ // manual thrust up to vlimit/2:
+ else {
+ double vfwd = ship->LiftLine() * ship->Velocity();
+
+ if (fabs(vfwd) >= vlimit) {
+ if (trans_z > 0 && vfwd > 0)
+ trans_z = 0;
+
+ else if (trans_z < 0 && vfwd < 0)
+ trans_z = 0;
+ }
+ }
+ }
+
+ // ----------------------------------------------------------
+ // STARSHIP HELM MODE
+ // ----------------------------------------------------------
+
+ else if (mode == Ship::FLCS_HELM) {
+ if (flcs_operative) {
+ double compass_heading = ship->CompassHeading();
+ double compass_pitch = ship->CompassPitch();
+ // rotate helm into compass orientation:
+ double helm = ship->GetHelmHeading() - compass_heading;
+
+ if (helm > PI)
+ helm -= 2*PI;
+ else if (helm < -PI)
+ helm += 2*PI;
+
+ // turn to align with helm heading:
+ if (helm != 0)
+ ship->ApplyYaw(helm);
+
+ // pitch to align with helm pitch:
+ if (compass_pitch != ship->GetHelmPitch())
+ ship->ApplyPitch(compass_pitch - ship->GetHelmPitch());
+
+ // roll to align with world coordinates:
+ if (ship->Design()->auto_roll > 0) {
+ Point vrt = ship->Cam().vrt();
+ double deflection = vrt.y;
+
+ if (fabs(helm) < PI/16 || ship->Design()->turn_bank < 0.01) {
+ if (ship->Design()->auto_roll > 1) {
+ ship->ApplyRoll(0.5);
+ }
+ else if (deflection != 0) {
+ double theta = asin(deflection);
+ ship->ApplyRoll(-theta);
+ }
+ }
+
+ // else roll through turn maneuvers:
+ else {
+ double desired_bank = ship->Design()->turn_bank;
+
+ if (helm >= 0)
+ desired_bank = -desired_bank;
+
+ double current_bank = asin(deflection);
+ double theta = desired_bank - current_bank;
+ ship->ApplyRoll(theta);
+
+ // coordinate the turn:
+ if (current_bank < 0 && desired_bank < 0 ||
+ current_bank > 0 && desired_bank > 0) {
+
+ double coord_pitch = compass_pitch
+ - ship->GetHelmPitch()
+ - fabs(helm) * fabs(current_bank);
+ ship->ApplyPitch(coord_pitch);
+ }
+ }
+ }
+ }
+
+ // flcs inoperative, set helm heading based on actual compass heading:
+ else {
+ ship->SetHelmHeading(ship->CompassHeading());
+ ship->SetHelmPitch(ship->CompassPitch());
+ }
+
+ // auto thrust to align flight path with helm order:
+ if (tx == 0) {
+ if (flcs_operative)
+ trans_x = (ship->Velocity() * ship->BeamLine() * ship->Mass() * -1);
+
+ else
+ trans_x = 0;
+ }
+
+ // manual thrust up to vlimit/2:
+ else {
+ double vfwd = ship->BeamLine() * ship->Velocity();
+
+ if (fabs(vfwd) >= vlimit/2) {
+ if (trans_x > 0 && vfwd > 0)
+ trans_x = 0;
+
+ else if (trans_x < 0 && vfwd < 0)
+ trans_x = 0;
+ }
+ }
+
+ if (trans_y == 0 && halt) {
+ double vfwd = ship->Heading() * ship->Velocity();
+ double vdesired = 0;
+
+ if (vfwd > vdesired) {
+ trans_y = -trans_y_limit;
+
+ if (!flcs_operative)
+ trans_y = 0;
+
+ double vdelta = vfwd-vdesired;
+ if (vdelta < vlimit/2)
+ trans_y *= (vdelta/(vlimit/2));
+ }
+ }
+
+
+
+ // auto thrust to align flight path with helm order:
+ if (tz == 0) {
+ if (flcs_operative)
+ trans_z = (ship->Velocity() * ship->LiftLine() * ship->Mass() * -1);
+
+ else
+ trans_z = 0;
+ }
+
+ // manual thrust up to vlimit/2:
+ else {
+ double vfwd = ship->LiftLine() * ship->Velocity();
+
+ if (fabs(vfwd) > vlimit/2) {
+ if (trans_z > 0 && vfwd > 0)
+ trans_z = 0;
+
+ else if (trans_z < 0 && vfwd < 0)
+ trans_z = 0;
+ }
+ }
+ }
+
+ if (ship->GetThruster()) {
+ ship->GetThruster()->ExecTrans(trans_x, trans_y, trans_z);
+ }
+ else {
+ ship->SetTransX(trans_x);
+ ship->SetTransY(trans_y);
+ ship->SetTransZ(trans_z);
+ }
}