Hello community,
here is the log from the commit of package moon-lander
checked in at Mon Sep 4 10:20:02 CEST 2006.
--------
--- moon-lander/moon-lander.changes 2006-01-27 14:33:37.000000000 +0100
+++ moon-lander/moon-lander.changes 2006-09-04 08:28:30.000000000 +0200
@@ -1,0 +2,11 @@
+Mon Sep 4 08:23:14 CEST 2006 - anosek@suse.cz
+
+- added a flight director and simplified autopilot [#183259]
+ (autopilot.tar.bz2, autopilot.dif, readme.patch)
+
+-------------------------------------------------------------------
+Wed Aug 23 11:24:05 CEST 2006 - anosek@suse.cz
+
+- changed prefix /usr/X11R6 -> /usr
+
+-------------------------------------------------------------------
New:
----
moon-lander-autopilot.dif
moon-lander-autopilot.tar.bz2
moon-lander-readme.patch
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ moon-lander.spec ++++++
--- /var/tmp/diff_new_pack.yBlB0e/_old 2006-09-04 10:19:53.000000000 +0200
+++ /var/tmp/diff_new_pack.yBlB0e/_new 2006-09-04 10:19:53.000000000 +0200
@@ -5,7 +5,7 @@
# This file and all modifications and additions to the pristine
# package are under the same license as the package itself.
#
-# Please submit bugfixes or comments via http://bugs.opensuse.org
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
# norootforbuild
@@ -18,13 +18,16 @@
#Requires: xforms
Autoreqprov: on
Version: 1.0
-Release: 1025
+Release: 1039
Summary: A 2D Game of Gravity
Source: %{name}-%{version}.tar.bz2
+Source1: %{name}-autopilot.tar.bz2
Patch0: %{name}.dif
Patch1: %{name}-destdir.patch
Patch2: %{name}-overflow.patch
Patch3: %{name}-makefile.patch
+Patch4: %{name}-autopilot.dif
+Patch5: %{name}-readme.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
@@ -42,11 +45,13 @@
Garrett Banuk
%prep
-%setup -n %{name}
+%setup -n %{name} -b0 -a1
%patch0 -p0
%patch1 -p1
%patch2 -p1
%patch3
+%patch4 -p1
+%patch5
%build
export RPM_OPT_FLAGS
@@ -71,9 +76,14 @@
%defattr(-,root,root)
%doc README.txt
/usr/share/games/moon-lander
-/usr/X11R6/bin/moon-lander
+/usr/bin/moon-lander
%changelog -n moon-lander
+* Mon Sep 04 2006 - anosek@suse.cz
+- added a flight director and simplified autopilot [#183259]
+ (autopilot.tar.bz2, autopilot.dif, readme.patch)
+* Wed Aug 23 2006 - anosek@suse.cz
+- changed prefix /usr/X11R6 -> /usr
* Fri Jan 27 2006 - nadvornik@suse.cz
- fixed BuildRequires
* Wed Jan 25 2006 - mls@suse.de
++++++ moon-lander-autopilot.dif ++++++
--- moon-lander/moon_lander.c 2006-06-09 06:11:51.000000000 -0400
+++ moon-lander/moon_lander.c 2006-06-09 06:09:19.000000000 -0400
@@ -14,6 +14,12 @@
* 08/17/2001 - cleaned up some of the messy code, fixed last of the memory leaks,
* added ryan daniels' ship and thrusters
*
+* 03/17/2002 - Dr. Robert Meier improved the autopilot to use minimum fuel
+* trajectory from current position and velocity.
+*
+* 05/06/2005 - Dr. Robert Meier improved the autopilot to act as a
+* flight director.
+*
*/
@@ -37,7 +43,6 @@
#define XSIZE 640
#define YSIZE 480
#define TERRAIN_YSIZE (YSIZE / 2)
-#define FPS (1000 / 35)
#define DATAPATH ""
#define FRESHRUN 0
@@ -96,6 +101,7 @@
int small_font;
int demo_mode;
int autopilot;
+ int flightdirector;
int state;
int ActualTime, LastTime;
int landing_pad;
@@ -108,6 +114,10 @@
Sprite thrustb;
Sprite thrust_left;
Sprite thrust_right;
+ Sprite crosshairs;
+ Sprite crosshairsb;
+ Sprite beacon;
+ Sprite beaconb;
Sprite miniship;
Sprite logo;
Sprite gameover_screen;
@@ -118,6 +128,7 @@
int opt_lp_warn;
int opt_num_lives;
int opt_fancy_terrain;
+ int opt_frame_period;
AI ai;
#ifndef NOSOUND
Mix_Chunk *engine;
@@ -164,8 +175,8 @@
/* timer - so that things run at an even speed regardless of cpu speed */
game->ActualTime = SDL_GetTicks();
- if (game->ActualTime < game->LastTime + FPS){
- SDL_Delay(game->LastTime + FPS - game->ActualTime);
+ if (game->ActualTime < game->LastTime + 10*game->opt_frame_period){
+ SDL_Delay(game->LastTime + 10*game->opt_frame_period - game->ActualTime);
}
game->LastTime = game->ActualTime;
}
@@ -195,7 +206,7 @@
}
while (!done){
- if ( files[count] = readdir(dir) ){
+ if ( (files[count] = readdir(dir)) ){
//printf("I see - %d %s\n", count, files[count]->d_name);
count++;
@@ -279,8 +290,9 @@
if ( (file = fopen(filename, "w")) != NULL) {
- fprintf(file,"%d %d %d %d %d", game->opt_num_lives, game->opt_lp_bonus,game->opt_lp_warn,
- game->opt_prog_grav,game->opt_fancy_terrain);
+ fprintf(file,"%d %d %d %d %d %d", game->opt_num_lives,
+ game->opt_lp_bonus,game->opt_lp_warn,game->opt_prog_grav,
+ game->opt_fancy_terrain,game->opt_frame_period);
}
else{
@@ -318,8 +330,9 @@
if ( (file = fopen(filename, "r")) != NULL) {
- fscanf(file,"%d %d %d %d %d", &game->opt_num_lives, &game->opt_lp_bonus, &game->opt_lp_warn,
- &game->opt_prog_grav, &game->opt_fancy_terrain);
+ fscanf(file,"%d %d %d %d %d %d", &game->opt_num_lives,
+ &game->opt_lp_bonus, &game->opt_lp_warn, &game->opt_prog_grav,
+ &game->opt_fancy_terrain, &game->opt_frame_period);
}
else{
@@ -345,11 +358,11 @@
int done = 0;
int *selected;
int position = 0;
- char options[5][100];
+ char options[6][100];
char display_string[150];
char selected_text[3];
int count;
- int value[5];
+ int value[6];
Uint8 *key_table;
SDL_Event event;
@@ -358,6 +371,7 @@
sprintf(options[2],"%s", "Landing Pad Speed Warning");
sprintf(options[3],"%s", "Variable Speed Landing Pads");
sprintf(options[4],"%s", "Number Of Ships");
+ sprintf(options[5],"%s", "Frame Period (x10ms)");
/* clear event buffer */
@@ -384,18 +398,38 @@
if (key_table[SDLK_UP]){
position--;
if (position < 0){
- position = 4;
+ position = 5;
}
}
if (key_table[SDLK_DOWN]){
position++;
- if (position >4){
+ if (position >5){
position = 0;
}
}
- if (key_table[SDLK_RETURN]){
+ if (key_table[SDLK_LEFT]){
+ (*selected)--;
+
+ if (position == 4){
+ if (*selected < 1 ){
+ *selected = 5;
+ }
+ }
+ else if (position == 5) {
+ if (*selected < 1){
+ *selected = 1;
+ }
+ }
+ else{
+ if (*selected < 0){
+ *selected = 1;
+ }
+ }
+ }
+
+ if (key_table[SDLK_RETURN] || key_table[SDLK_RIGHT]){
(*selected)++;
if (position == 4){
@@ -403,6 +437,8 @@
*selected = 1;
}
}
+ else if (position == 5) {
+ }
else{
if (*selected > 1){
*selected = 0;
@@ -428,12 +464,16 @@
else if (position == 4){
selected = &(game->opt_num_lives);
}
+ else if (position == 5){
+ selected = &(game->opt_frame_period);
+ }
value[0] = game->opt_fancy_terrain;
value[1] = game->opt_prog_grav;
value[2] = game->opt_lp_warn;
value[3] = game->opt_lp_bonus;
value[4] = game->opt_num_lives;
+ value[5] = game->opt_frame_period;
/* draw the options */
@@ -442,7 +482,7 @@
DT_DrawText("Arrow Keys Select", game->screen, game->small_font, 260, 75);
DT_DrawText("ENTER changes value", game->screen, game->small_font, 260, 90);
- for (count = 0; count < 5; count ++) {
+ for (count = 0; count < 6; count ++) {
if (position == count) {
sprintf(selected_text,"%s","**");
@@ -883,6 +923,7 @@
draw_score(game, 0);
DT_DrawText("Arrow keys control the ship", game->screen, game->big_font, 100, 100 );
DT_DrawText("Q quit P pause ESC options", game->screen, game->big_font, 75, 125 );
+ DT_DrawText("A autopilot F flight director", game->screen, game->big_font, 75, 150 );
DT_DrawText("Press ENTER to play", game->screen, game->big_font, 175, 170 );
DT_DrawText("Score for each round = landing pad score + remaining fuel.", game->screen, game->small_font, 150, 280 );
@@ -1256,6 +1297,44 @@
/************************************************/
+void gamefd( Game *game)
+{
+ /* ----------------------------------------------------------------
+ Flight Directory - written by Dr. Robert Meier 06/05/2006
+
+ During powered descent from low-phi (nearly parallel to the
+ horizon) orbit, the lunar module analog computer presented the
+ pilot with two oscilloscope displays.
+ One presented the predicted rate of climb and crosstrack speed
+ at the time that downrange speed was zero.
+ The second predicted altitude and crosstrack error at the time
+ that downrange speed was zero.
+ The pilot's goal was to keep the blip on each oscilloscope
+ centered as the predictions were updated according to radar.
+
+ As a similar presentation, use a point to indicate the lowest
+ altitude and further side motion if thrust is applied continously.
+
+ ---------------------------------------------------------------- */
+ const float G = game->gravity;
+ const float A = 0.10;
+ const float B = 0.07;
+ Sprite *ship = &game->ship;
+ float xi = ship->x + 0.5 * ship->w;
+ float yi = ship->y + ship->h;
+ float hi = ship->x_vel;
+ float vi = ship->y_vel;
+ float sgn = hi > 0 ? 1 : -1;
+ int cx = xi - 4 + sgn * hi * hi / (2 * B);
+ int cy = yi - 4 + vi * vi / (2 * (A-G));
+ game->crosshairs.x = cx;
+ game->crosshairs.y = cy;
+ game->crosshairsb.x = game->crosshairs.x;
+ game->crosshairsb.y = game->crosshairs.y;
+}
+
+/************************************************/
+
void gameai( int *left,
int *right,
int *down,
@@ -1275,7 +1354,203 @@
velocity.
4 => Freefall with minor course changes
+ Game AI -- improved by Dr. Robert Meier 03/17/2002
+
+ The lunar lander powered descent from low-phi orbit was a
+ nonlinear problem well beyond autopilots until the 1970s.
+ Landing with perfect attitude control on a flat surface is
+ easy.
+
+ The minimum fuel course is called bang-bang control.
+
+ No vertical thrust until continuous vertical thrust will zero
+ descent rate at the pad.
+ Accelerate horizontally the minimum necessary to reach the pad.
+ Coast horizontally until continuous deceleration is required.
+ Decelerate continuously to reach zero groundspeed over the pad.
+
+ To avoid burning landing gear off with backblast, you should actually
+ shutdown shutdown and freefall when altitude and vertical speed are
+ low enough.
+
------------------------------------------------------------- */
+#if 1
+ // Find the nearest pad.
+ game->ai.pad = 0;
+ game->ai.distance = 9999;
+ float x = game->ship.x + game->ship.w/2;
+ for( count = 0; count < game->current_level.num_landings; count++ ) {
+ if( abs( x-game->current_level.landing_x[count] ) < game->ai.distance ) {
+ game->ai.distance = abs( x - game->current_level.landing_x[count] );
+ game->ai.pad = count;
+ }
+ }
+
+ // Find the target hovering point. (Allow .05 margin for error.)
+ int max_x = game->current_level.landing_x[game->ai.pad]
+ + game->current_level.landing_w[game->ai.pad]/2;
+ float max_v = game->current_level.landing_speed[game->ai.pad]-.05;
+ int max_y = game->current_level.landing_y[game->ai.pad];
+
+ // Let the user know which pad is in use
+ game->beacon.x = max_x;
+ game->beacon.y = max_y;
+ game->beaconb.x = max_x;
+ game->beaconb.y = max_y;
+
+ // Determine the time to target.
+ // y(-i) - freefall altitude that would result in current descent rate
+ // (assumed freefall)
+ // y(-t) - altitude now
+ // v(-t) - descent rate now
+ // (actual freefall)
+ // y(0) - altitude at burn
+ // (continuous burn)
+ // y(f) - pad altitude
+ //
+ // Thanks to Galileo, we know
+ // g - gravity
+ // a - acceleration (thrust - gravity)
+ // y(-i) = y(0) - g i i / 2
+ // y(-t) = y(-i) + g (i-t) (i-t) / 2
+ // v(-t) = g (i-t)
+ // y(f) = y(0) + a f f / 2
+ // a [y(f) - y(0)] = g [y(0) - y(-i)]
+ // a f = g i
+ // We can now rewrite
+ // y(-i) = y(-t) - v(-t) v(-t) / 2 g
+ // y(0) = [a y(f) + g y(-i)] / (a + g)
+ // i = sqrt(2 [y(0) - y(-i)] / g)
+ // f = sqrt(2 [y(f) - y(0)] / a)
+ // t = i - v(-t) / g
+
+ float g = game->gravity;
+ float a = .10 - g;
+ float yt = game->ship.y + game->ship.h;
+ float vt = game->ship.y_vel;
+ float yf = max_y;
+ float yi = yt - vt * vt / (2 * g);
+ float y0 = (a * yf + g * yi) / (a + g);
+ float i = sqrt(2 * (y0 - yi) / g);
+ float f = sqrt(2 * (yf - y0) / a);
+ float t = i - vt / g;
+
+ // Thrust upward if continuous thrust will be just enough.
+ // (Allow one frame margin for error.)
+ // (Dont thrust if we are climbing.)
+ // (Dont cancel pilot command.)
+ if( !*down && 0 < vt ) {
+ if( 2 > t ) {
+ *down = 1;
+ t = 0;
+ }
+ }
+
+// printf( "ai-y: pad: %3d ship: %3f %5.2f g: %4.2f d: %d\n",
+// max_y, yt, vt, g, *down);
+
+ // Bang-bang control has an eigenfunction and three states.
+ //
+ // The eigenfunction is the phase space (position vs speed) trajectory
+ // during continuous burn.
+ // w - acceleration
+ // x(-b) - position now
+ // u(-b) - groundspeed now
+ // C - position of zero groundspeed relative to speed direction
+ // T - time to coast and decelerate
+ // The eigenfunction, the position axis, and the time to target,
+ // divide the space into three pairs of regions.
+ // C = x(-b) sgn(u(-b)) + u(-b) u(-b) / 2 abs(w)
+ // T = abs(x(-b)) / abs(u(-b)) + abs(u(-b)) / 2 abs(w)
+ //
+ // x
+ // . accelerating : decelerating
+ // . :
+ // . <<<<:
+ // . <<< :
+ // . . .<< :
+ // . . . :
+ // .coast . :
+ // . . :
+ // . v . :
+ // . v :
+ // .v. :
+ // . . + . . --- v
+ // : . .
+ // : coast .
+ // : . .
+ // > : . .
+ // >> : . .
+ // >>> : . . .
+ // >>>>: . . .
+ // : .
+ // : .
+ // decelerating : accelerating .
+ // : .
+ //
+ // State I: decelerating
+ // C > 0 - condition
+ // w = -abs(w) sgn(u(-b))
+ // State I transitions to state II if actual acceleration is greater than w.
+ //
+ // State II: coasting
+ // C < 0 & t+f > T - condition
+ // w = 0
+ // State II transitions to state I as C increases.
+ //
+ // State III: accelerating
+ // C < 0 & t+f < T - condition
+ // w = abs(w) sgn(u(-b))
+ // State III transition to state II if actual acceleration is greater than w.
+ //
+
+ float xb = x - max_x;
+ float w = .065;
+ float ub = game->ship.x_vel;
+ float C = xb * (0 < ub ? 1 : 0 > ub ? -1 : 0) + ub * ub / (2 * fabs(w));
+ float T = fabs(xb) / (fabs(ub) + .001) + fabs(ub) / (2 * fabs(w));
+
+ // Thrust if continuous thrust will be just enough.
+ // (Dont cancel pilot command.)
+ // (Dont thrust if close enough)
+ // (Shutdown if altitude is low enough)
+ if( !*left && !*right ) {
+ *left = 0;
+ *right = 0;
+ if( .1 < fabs(ub) || 1 < fabs(xb) ) {
+ if( 0 < C ) { /* State I: decelerating */
+ if( 0 < ub ) {
+ *left = 1; /* confirmed */
+ }
+ else{
+ *right = 1; /* confirmed */
+ }
+ }
+ else{
+ if( t + f > T ) { /* State II: coasting */
+ }
+ else{ /* State III: accelerating */
+ if( 0 < ub ) {
+ *right = 1;
+ }
+ else{
+ *left = 1;
+ }
+ }
+ }
+ }
+ else{
+ float alt = game->current_level.landing_y[game->ai.pad] - yt;
+ if( 2 * g * alt + vt * vt < max_v * max_v ) {
+ *down = 0; /* shutdown */
+ }
+ }
+ }
+
+// printf( "ai-x: pad: %3d ship: %3f %5.2f C: %5.2f t+f: %5.2f T: %5.2f l: %d r: %d\n",
+// max_x, xb+max_x, ub, C, t+f, T, *left, *right);
+
+#else /* 1 */
*left = 0;
*right = 0;
@@ -1397,6 +1672,7 @@
//printf( "4: game->ship.x=%f state=%d target=%f x_vel=%f y_vel=%f vdiff=%f\n", game->ship.x, game->ai.state, game->ai.target, game->ship.x_vel, game->ship.y_vel, game->ai.vdiff );
}
+#endif /* 1 */
return;
}
@@ -1423,6 +1699,7 @@
int pause = 0;
int pressed = 0;
int appressed = 0;
+ int fdpressed = 0;
char display_string[100];
game->ai.state = 0;
@@ -1474,7 +1751,7 @@
// toggle
if( !appressed ) {
game->autopilot = (game->autopilot)?0:1;
- appressed++;
+ appressed = 1;
if( game->autopilot == 1 ) {
game->ai.state = 0;
}
@@ -1485,6 +1762,19 @@
appressed = 0;
}
}
+
+ if (key_table[SDLK_f]){
+ // toggle
+ if( !fdpressed ) {
+ game->flightdirector = (game->flightdirector)?0:1;
+ fdpressed = 1;
+ }
+ }
+ else{
+ if( fdpressed ) {
+ fdpressed = 0;
+ }
+ }
if (key_table[SDLK_q]){
exit(0);
@@ -1522,10 +1812,19 @@
if( !pause ) {
- if( game->demo_mode || game->autopilot ) {
+ if( game->demo_mode ) {
game->gravity = 0.05;
gameai( &left, &right, &down, game );
}
+ else{
+ if( game->autopilot ) {
+ gameai( &left, &right, &down, game );
+ }
+ }
+
+ if( game->flightdirector ) {
+ gamefd( game );
+ }
if( game->fuel > 0 ) {
if( right == 1 ) {
@@ -1632,6 +1931,40 @@
draw_sprite(game->screen, game->thrust_left);
}
+ /* display flight director */
+
+ if (game->flightdirector) {
+ if ( (odd_even%2) == 0) {
+ draw_sprite(game->screen, game->crosshairs);
+ }
+ else{
+ draw_sprite(game->screen, game->crosshairsb);
+ }
+ float hi = game->ship.x_vel;
+ float vi = game->ship.y_vel;
+ float scale = fabs(hi);
+ scale = fabs(vi) > scale ? fabs(vi) : scale;
+ scale = 2 > scale ? 2 : scale;
+ int xy, x, y;
+ int cx = game->crosshairs.x+4;
+ int cy = game->crosshairs.y+4;
+ for( xy = 1; xy < 15; xy++ ){
+ x = xy * (hi/scale) * 2, y = xy * (vi/scale) * 2;
+ DrawPixel(game->screen, 0, 255, 0, cx-x, cy-y);
+ }
+ }
+
+ /* display autopilot */
+
+ if (game->autopilot || game->demo_mode) {
+ if ( (odd_even%2) == 0) {
+ draw_sprite(game->screen, game->beacon);
+ }
+ else{
+ draw_sprite(game->screen, game->beaconb);
+ }
+ }
+
/* display fuel */
draw_score(game, 1);
@@ -1801,6 +2134,18 @@
sprintf(filename, "%simages/thrust2.png", DATAPATH);
new_sprite(&(game.thrustb), filename, 0, 0, 1, 0);
+ sprintf(filename, "%simages/crosshairs1.bmp", DATAPATH);
+ new_sprite(&(game.crosshairs), filename, 0, 0, 1, 0);
+
+ sprintf(filename, "%simages/crosshairs2.bmp", DATAPATH);
+ new_sprite(&(game.crosshairsb), filename, 0, 0, 1, 0);
+
+ sprintf(filename, "%simages/beacon1.bmp", DATAPATH);
+ new_sprite(&(game.beacon), filename, 0, 0, 1, 0);
+
+ sprintf(filename, "%simages/beacon2.bmp", DATAPATH);
+ new_sprite(&(game.beaconb), filename, 0, 0, 1, 0);
+
sprintf(filename, "%simages/thrust_left.bmp", DATAPATH);
new_sprite(&(game.thrust_left), filename, 0, 0, 1, 0);
++++++ moon-lander-destdir.patch ++++++
--- /var/tmp/diff_new_pack.yBlB0e/_old 2006-09-04 10:19:53.000000000 +0200
+++ /var/tmp/diff_new_pack.yBlB0e/_new 2006-09-04 10:19:53.000000000 +0200
@@ -1,5 +1,5 @@
---- moon-lander/./install.sh.orig 2003-06-16 10:29:13.000000000 +0200
-+++ moon-lander/./install.sh 2003-06-16 10:30:12.000000000 +0200
+--- moon-lander/install.sh
++++ moon-lander/install.sh
@@ -1,17 +1,18 @@
#!/bin/sh
@@ -31,5 +31,5 @@
+chmod 644 $DESTDIR/usr/share/games/moon-lander/sounds/*
+chmod 755 $DESTDIR/usr/share/games/moon-lander/fonts
+chmod 644 $DESTDIR/usr/share/games/moon-lander/fonts/*
-+mkdir -p $DESTDIR/usr/X11R6/bin
-+cp moon-lander/moon-lander $DESTDIR/usr/X11R6/bin/
++mkdir -p $DESTDIR/usr/bin
++cp moon-lander/moon-lander $DESTDIR/usr/bin/
++++++ moon-lander-overflow.patch ++++++
--- /var/tmp/diff_new_pack.yBlB0e/_old 2006-09-04 10:19:53.000000000 +0200
+++ /var/tmp/diff_new_pack.yBlB0e/_new 2006-09-04 10:19:53.000000000 +0200
@@ -1,5 +1,5 @@
---- moon-lander/moon_lander.c.xx 2005-05-10 09:58:48.292671039 +0200
-+++ moon-lander/moon_lander.c 2005-05-10 09:59:12.632222136 +0200
+--- moon-lander/moon_lander.c
++++ moon-lander/moon_lander.c
@@ -24,6 +24,7 @@
#include
#include
++++++ moon-lander-readme.patch ++++++
--- README.txt
+++ README.txt
@@ -17,6 +17,37 @@
Moon Lander is a 2D game of gravity. Land your ship on the lading pad. Don't go too fast, or you will crash.
+-----
+
+Flight Director
+
+During powered descent from low-phi (nearly parallel to the horizon) orbit, the Apollo Lunar Module Guidance and Navigation Computer presented the pilot with two oscilloscope displays.
+
+This flight director attempts to simplify the same feel.
+
+When enabled, the flight director displays a cross-hairs and comet-trail. For a perfect landing, the cross-hairs should be on the center of the desired landing pad and the comet-trail should be perpendicular to the landing pad.
+
+The cross-hairs indicates the lowest altitude if vertical thrust is used continuously, and the furthest translation if horizontal deceleration is used continuously. The comet-trail indicates the current velocity direction and speed (if sufficiently small).
+
+In general, you should never let the cross-hairs drop much below the level of the landing pad, because even with continuous thrust, you will drop below the level of the landing pad (and presumably hit the terrain).
+
+In general, unless necessary to avoid terrain, you should avoid letting the cross-hairs pass the landing pad, because you will waste fuel overshooting the pad and returning.
+
+Likewise, in general, you should avoid letting the comet-trail get too flat, lest you waste fuel racing over the terrain to a straight descent from too-high over the landing pad.
+
+In general, you should use the comet-trail as a rough guide to clear the terrain by the minimum amount that you are sure of.
+
+-----
+
+Autopilot
+
+When enabled, the autopilot maintains a minimum-fuel course to the landing beacon (the blinking light on the nearest landing pad).
+
+The autopilot is unaware of intervening terrain, so you as pilot must provide terrain separation.
+
+You can provide terrain separation by firing the vertical and horizontal thrusters. The autopilot will not override your commands, but you can override the autopilot commands.
+
+In general, to conserve fuel, you should fire the appropriate horizontal thruster just enough to clear terrain to the nearest landing pad.
-----
@@ -56,6 +87,10 @@
Changelog:
+2005-05-06:
+ Improved autopilot and added flight director.
+2002-03-17:
+ Added minimum-fuel autopilot.
2001-08-29 - (1.0pre1):
Made windows port, changed all game art and sounds to Free art and sounds (geekd, rdaniels), added demo mode (mheckman), added options (geekd). This is the last version before 1.0 (find those bugs!)
2001-07-14 - (0.9.0):
@@ -91,6 +126,7 @@
Brian "Mo" Degenhardt - bmd@mp3.com:
Fancy terrain.
-magigames.org
-
+Robert Meier - robert.meier@computer.org:
+Flight director, Autopilot
+magigames.org
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org