Get rid of FORTRANisms.
authorEric S. Raymond <esr@thyrsus.com>
Sun, 6 Feb 2005 21:49:56 +0000 (21:49 +0000)
committerEric S. Raymond <esr@thyrsus.com>
Sun, 6 Feb 2005 21:49:56 +0000 (21:49 +0000)
ai.c
battle.c
events.c
finish.c
io.c
moving.c
planets.c
reports.c
setup.c
sst.c
sst.h

diff --git a/ai.c b/ai.c
index 0fe92c8ff8b1c1282b1065db1ed4819162d102af..762e745dcf4dbe9ff62a0943ebf291506034e3e6 100644 (file)
--- a/ai.c
+++ b/ai.c
 #include "sst.h"
 
-static int tryexit(int lookx, int looky, int ienm, int loccom, int irun) {
-       int iqx, iqy, l;
+static int tryexit(int lookx, int looky, int ienm, int loccom, int irun) 
+{
+    int iqx, iqy, l;
 
-       iqx = quadx+(lookx+(QUADSIZE-1))/QUADSIZE - 1;
-       iqy = quady+(looky+(QUADSIZE-1))/QUADSIZE - 1;
-       if (iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE ||
-               game.state.galaxy[iqx][iqy] > 899)
-               return 0; /* no can do -- neg energy, supernovae, or >8 Klingons */
-       if (ienm == IHR) return 0; /* Romulans cannot escape! */
-       if (irun == 0) {
-               /* avoid intruding on another commander's territory */
-               if (ienm == IHC) {
-                       for (l = 1; l <= game.state.remcom; l++)
-                               if (game.state.cx[l]==iqx && game.state.cy[l]==iqy) return 0;
-                       /* refuse to leave if currently attacking starbase */
-                       if (batx==quadx && baty==quady) return 0;
-               }
-               /* don't leave if over 1000 units of energy */
-               if (game.kpower[loccom] > 1000.) return 0;
-       }
-       /* print escape message and move out of quadrant.
-          We know this if either short or long range sensors are working */
-       if (game.damage[DSRSENS] == 0.0 || game.damage[DLRSENS] == 0.0 ||
-               condit == IHDOCKED) {
-               crmena(1, ienm, 2, game.kx[loccom], game.ky[loccom]);
-               prout(" escapes to %s (and regains strength).",
-                      cramlc(quadrant, iqx, iqy));
-       }
-       /* handle local matters related to escape */
-       game.quad[game.kx[loccom]][game.ky[loccom]] = IHDOT;
-       game.kx[loccom] = game.kx[nenhere];
-       game.ky[loccom] = game.ky[nenhere];
-       game.kavgd[loccom] = game.kavgd[nenhere];
-       game.kpower[loccom] = game.kpower[nenhere];
-       game.kdist[loccom] = game.kdist[nenhere];
-       klhere--;
-       nenhere--;
-       if (condit != IHDOCKED) newcnd();
-       /* Handle global matters related to escape */
-       game.state.galaxy[quadx][quady] -= ENEMY_PLACE;
-       game.state.galaxy[iqx][iqy] += ENEMY_PLACE;
-       if (ienm==IHS) {
-               ishere=0;
-               iscate=0;
-               ientesc=0;
-               isatb=0;
-               game.future[FSCMOVE]=0.2777+game.state.date;
-               game.future[FSCDBAS]=1e30;
-               game.state.isx=iqx;
-               game.state.isy=iqy;
+    iqx = quadx+(lookx+(QUADSIZE-1))/QUADSIZE - 1;
+    iqy = quady+(looky+(QUADSIZE-1))/QUADSIZE - 1;
+    if (iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE ||
+       NOEXIT(game.state.galaxy[iqx][iqy]))
+       return 0; /* no can do -- neg energy, supernovae, or >8 Klingons */
+    if (ienm == IHR) return 0; /* Romulans cannot escape! */
+    if (irun == 0) {
+       /* avoid intruding on another commander's territory */
+       if (ienm == IHC) {
+           for (l = 1; l <= game.state.remcom; l++)
+               if (game.state.cx[l]==iqx && game.state.cy[l]==iqy) return 0;
+           /* refuse to leave if currently attacking starbase */
+           if (batx==quadx && baty==quady) return 0;
        }
-       else {
-               for (l=1; l<=game.state.remcom; l++) {
-                       if (game.state.cx[l]==quadx && game.state.cy[l]==quady) {
-                               game.state.cx[l]=iqx;
-                               game.state.cy[l]=iqy;
-                               break;
-                       }
-               }
-               comhere = 0;
+       /* don't leave if over 1000 units of energy */
+       if (game.kpower[loccom] > 1000.) return 0;
+    }
+    /* print escape message and move out of quadrant.
+       We know this if either short or long range sensors are working */
+    if (game.damage[DSRSENS] == 0.0 || game.damage[DLRSENS] == 0.0 ||
+       condit == IHDOCKED) {
+       crmena(1, ienm, 2, game.kx[loccom], game.ky[loccom]);
+       prout(" escapes to %s (and regains strength).",
+             cramlc(quadrant, iqx, iqy));
+    }
+    /* handle local matters related to escape */
+    game.quad[game.kx[loccom]][game.ky[loccom]] = IHDOT;
+    game.kx[loccom] = game.kx[nenhere];
+    game.ky[loccom] = game.ky[nenhere];
+    game.kavgd[loccom] = game.kavgd[nenhere];
+    game.kpower[loccom] = game.kpower[nenhere];
+    game.kdist[loccom] = game.kdist[nenhere];
+    klhere--;
+    nenhere--;
+    if (condit != IHDOCKED) newcnd();
+    /* Handle global matters related to escape */
+    game.state.galaxy[quadx][quady] -= KLINGON_PLACE;
+    game.state.galaxy[iqx][iqy] += KLINGON_PLACE;
+    if (ienm==IHS) {
+       ishere=0;
+       iscate=0;
+       ientesc=0;
+       isatb=0;
+       game.future[FSCMOVE]=0.2777+game.state.date;
+       game.future[FSCDBAS]=1e30;
+       game.state.isx=iqx;
+       game.state.isy=iqy;
+    }
+    else {
+       for (l=1; l<=game.state.remcom; l++) {
+           if (game.state.cx[l]==quadx && game.state.cy[l]==quady) {
+               game.state.cx[l]=iqx;
+               game.state.cy[l]=iqy;
+               break;
+           }
        }
-       return 1; /* success */
+       comhere = 0;
+    }
+    return 1; /* success */
 }
 
 
-static void movebaddy(int comx, int comy, int loccom, int ienm) {
-       int motion, mdist, nsteps, mx, my, nextx, nexty, lookx, looky, ll;
-       int irun = 0;
-       int krawlx, krawly;
-       int success;
-       int attempts;
-       /* This should probably be just comhere + ishere */
-       int nbaddys = skill > 3 ?
-                                 (int)((comhere*2 + ishere*2+klhere*1.23+irhere*1.5)/2.0):
-                                 (comhere + ishere);
-       double dist1, forces;
+static void movebaddy(int comx, int comy, int loccom, int ienm) 
+{
+    int motion, mdist, nsteps, mx, my, nextx, nexty, lookx, looky, ll;
+    int irun = 0;
+    int krawlx, krawly;
+    int success;
+    int attempts;
+    /* This should probably be just comhere + ishere */
+    int nbaddys = skill >= SKILL_EXPERT ?
+       (int)((comhere*2 + ishere*2+klhere*1.23+irhere*1.5)/2.0):
+       (comhere + ishere);
+    double dist1, forces;
 
-       dist1 = game.kdist[loccom];
-       mdist = dist1 + 0.5; /* Nearest integer distance */
+    dist1 = game.kdist[loccom];
+    mdist = dist1 + 0.5; /* Nearest integer distance */
 
-       /* If SC, check with spy to see if should hi-tail it */
-       if (ienm==IHS &&
-               (game.kpower[loccom] <= 500.0 || (condit==IHDOCKED && game.damage[DPHOTON]==0))) {
-               irun = 1;
-               motion = -QUADSIZE;
-       }
-       else {
-               /* decide whether to advance, retreat, or hold position */
+    /* If SC, check with spy to see if should hi-tail it */
+    if (ienm==IHS &&
+       (game.kpower[loccom] <= 500.0 || (condit==IHDOCKED && game.damage[DPHOTON]==0))) {
+       irun = 1;
+       motion = -QUADSIZE;
+    }
+    else {
+       /* decide whether to advance, retreat, or hold position */
 /* Algorithm:
  * Enterprise has "force" based on condition of phaser and photon torpedoes.
    If both are operating full strength, force is 1000. If both are damaged,
       force is -1000. Having shields down subtracts an additional 1000.
+ * Enterprise has "force" based on condition of phaser and photon torpedoes.
+ If both are operating full strength, force is 1000. If both are damaged,
+ force is -1000. Having shields down subtracts an additional 1000.
 
  * Enemy has forces equal to the energy of the attacker plus
    100*(K+R) + 500*(C+S) - 400 for novice through good levels OR
       346*K + 400*R + 500*(C+S) - 400 for expert and emeritus.
+ * Enemy has forces equal to the energy of the attacker plus
+ 100*(K+R) + 500*(C+S) - 400 for novice through good levels OR
+ 346*K + 400*R + 500*(C+S) - 400 for expert and emeritus.
 
       Attacker Initial energy levels (nominal):
                Klingon   Romulan   Commander   Super-Commander
       Novice    400        700        1200        
       Fair      425        750        1250
       Good      450        800        1300        1750
       Expert    475        850        1350        1875
       Emeritus  500        900        1400        2000
    VARIANCE   75        200         200         200
+ Attacker Initial energy levels (nominal):
+ Klingon   Romulan   Commander   Super-Commander
+ Novice    400        700        1200        
+ Fair      425        750        1250
+ Good      450        800        1300        1750
+ Expert    475        850        1350        1875
+ Emeritus  500        900        1400        2000
+ VARIANCE   75        200         200         200
 
       Enemy vessels only move prior to their attack. In Novice - Good games
       only commanders move. In Expert games, all enemy vessels move if there
       is a commander present. In Emeritus games all enemy vessels move.
+ Enemy vessels only move prior to their attack. In Novice - Good games
+ only commanders move. In Expert games, all enemy vessels move if there
+ is a commander present. In Emeritus games all enemy vessels move.
 
 *  If Enterprise is not docked, an agressive action is taken if enemy
    forces are 1000 greater than Enterprise.
+ *  If Enterprise is not docked, an agressive action is taken if enemy
+ forces are 1000 greater than Enterprise.
 
       Agressive action on average cuts the distance between the ship and
       the enemy to 1/4 the original.
+ Agressive action on average cuts the distance between the ship and
+ the enemy to 1/4 the original.
 
 *  At lower energy advantage, movement units are proportional to the
    advantage with a 650 advantage being to hold ground, 800 to move forward
       1, 950 for two, 150 for back 4, etc. Variance of 100.
+ *  At lower energy advantage, movement units are proportional to the
+ advantage with a 650 advantage being to hold ground, 800 to move forward
+ 1, 950 for two, 150 for back 4, etc. Variance of 100.
 
       If docked, is reduced by roughly 1.75*skill, generally forcing a
       retreat, especially at high skill levels.
+ If docked, is reduced by roughly 1.75*skill, generally forcing a
+ retreat, especially at high skill levels.
 
 *  Motion is limited to skill level, except for SC hi-tailing it out.
 */
+ *  Motion is limited to skill level, except for SC hi-tailing it out.
+ */
 
-               forces = game.kpower[loccom]+100.0*nenhere+400*(nbaddys-1);
-               if (shldup==0) forces += 1000; /* Good for enemy if shield is down! */
-               if (game.damage[DPHASER] == 0.0 || game.damage[DPHOTON] == 0.0) {
-                       if (game.damage[DPHASER] != 0) /* phasers damaged */
-                               forces += 300.0;
-                       else
-                               forces -= 0.2*(energy - 2500.0);
-                       if (game.damage[DPHOTON] != 0) /* photon torpedoes damaged */
-                               forces += 300.0;
-                       else
-                               forces -= 50.0*torps;
-               }
-               else {
-                       /* phasers and photon tubes both out! */
-                       forces += 1000.0;
-               }
-               motion = 0;
-               if (forces <= 1000.0 && condit != IHDOCKED) /* Typical situation */
-                       motion = ((forces+200.0*Rand())/150.0) - 5.0;
-               else {
-                       if (forces > 1000.0) /* Very strong -- move in for kill */
-                               motion = (1.0-square(Rand()))*dist1 + 1.0;
-                       if (condit==IHDOCKED) /* protected by base -- back off ! */
-                               motion -= skill*(2.0-square(Rand()));
-               }
-#ifdef DEBUG
-               if (idebug) {
-                       proutn("MOTION = %1.2f", motion);
-                       proutn("  FORCES = %1,2f", forces);
-               }
-#endif
-               /* don't move if no motion */
-               if (motion==0) return;
-               /* Limit motion according to skill */
-               if (abs(motion) > skill) motion = (motion < 0) ? -skill : skill;
+       forces = game.kpower[loccom]+100.0*nenhere+400*(nbaddys-1);
+       if (shldup==0) forces += 1000; /* Good for enemy if shield is down! */
+       if (game.damage[DPHASER] == 0.0 || game.damage[DPHOTON] == 0.0) {
+           if (game.damage[DPHASER] != 0) /* phasers damaged */
+               forces += 300.0;
+           else
+               forces -= 0.2*(energy - 2500.0);
+           if (game.damage[DPHOTON] != 0) /* photon torpedoes damaged */
+               forces += 300.0;
+           else
+               forces -= 50.0*torps;
+       }
+       else {
+           /* phasers and photon tubes both out! */
+           forces += 1000.0;
+       }
+       motion = 0;
+       if (forces <= 1000.0 && condit != IHDOCKED) /* Typical situation */
+           motion = ((forces+200.0*Rand())/150.0) - 5.0;
+       else {
+           if (forces > 1000.0) /* Very strong -- move in for kill */
+               motion = (1.0-square(Rand()))*dist1 + 1.0;
+           if (condit==IHDOCKED) /* protected by base -- back off ! */
+               motion -= skill*(2.0-square(Rand()));
        }
-       /* calcuate preferred number of steps */
-       nsteps = motion < 0 ? -motion : motion;
-       if (motion > 0 && nsteps > mdist) nsteps = mdist; /* don't overshoot */
-       if (nsteps > QUADSIZE) nsteps = QUADSIZE; /* This shouldn't be necessary */
-       if (nsteps < 1) nsteps = 1; /* This shouldn't be necessary */
 #ifdef DEBUG
        if (idebug) {
-               prout("NSTEPS = %d", nsteps);
+           proutn("MOTION = %1.2f", motion);
+           proutn("  FORCES = %1,2f", forces);
        }
 #endif
-       /* Compute preferred values of delta X and Y */
-       mx = sectx - comx;
-       my = secty - comy;
-       if (2.0 * abs(mx) < abs(my)) mx = 0;
-       if (2.0 * abs(my) < abs(sectx-comx)) my = 0;
-       if (mx != 0) mx = mx*motion < 0 ? -1 : 1;
-       if (my != 0) my = my*motion < 0 ? -1 : 1;
-       nextx = comx;
-       nexty = comy;
-       /* main move loop */
-       for (ll = 1; ll <= nsteps; ll++) {
+       /* don't move if no motion */
+       if (motion==0) return;
+       /* Limit motion according to skill */
+       if (abs(motion) > skill) motion = (motion < 0) ? -skill : skill;
+    }
+    /* calcuate preferred number of steps */
+    nsteps = motion < 0 ? -motion : motion;
+    if (motion > 0 && nsteps > mdist) nsteps = mdist; /* don't overshoot */
+    if (nsteps > QUADSIZE) nsteps = QUADSIZE; /* This shouldn't be necessary */
+    if (nsteps < 1) nsteps = 1; /* This shouldn't be necessary */
 #ifdef DEBUG
-               if (idebug) {
-                       prout("%d", ll);
-               }
+    if (idebug) {
+       prout("NSTEPS = %d", nsteps);
+    }
 #endif
-               /* Check if preferred position available */
-               lookx = nextx + mx;
-               looky = nexty + my;
-               krawlx = mx < 0 ? 1 : -1;
-               krawly = my < 0 ? 1 : -1;
-               success = 0;
-               attempts = 0; /* Settle mysterious hang problem */
-               while (attempts++ < 20 && !success) {
-                       if (lookx < 1 || lookx > QUADSIZE) {
-                               if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
-                                       return;
-                               if (krawlx == mx || my == 0) break;
-                               lookx = nextx + krawlx;
-                               krawlx = -krawlx;
-                       }
-                       else if (looky < 1 || looky > QUADSIZE) {
-                               if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
-                                       return;
-                               if (krawly == my || mx == 0) break;
-                               looky = nexty + krawly;
-                               krawly = -krawly;
-                       }
-                       else if (game.quad[lookx][looky] != IHDOT) {
-                               /* See if we should ram ship */
-                               if (game.quad[lookx][looky] == ship &&
-                                       (ienm == IHC || ienm == IHS)) {
-                                       ram(1, ienm, comx, comy);
-                                       return;
-                               }
-                               if (krawlx != mx && my != 0) {
-                                       lookx = nextx + krawlx;
-                                       krawlx = -krawlx;
-                               }
-                               else if (krawly != my && mx != 0) {
-                                       looky = nexty + krawly;
-                                       krawly = -krawly;
-                               }
-                               else break; /* we have failed */
-                       }
-                       else success = 1;
-               }
-               if (success) {
-                       nextx = lookx;
-                       nexty = looky;
+    /* Compute preferred values of delta X and Y */
+    mx = sectx - comx;
+    my = secty - comy;
+    if (2.0 * abs(mx) < abs(my)) mx = 0;
+    if (2.0 * abs(my) < abs(sectx-comx)) my = 0;
+    if (mx != 0) mx = mx*motion < 0 ? -1 : 1;
+    if (my != 0) my = my*motion < 0 ? -1 : 1;
+    nextx = comx;
+    nexty = comy;
+    /* main move loop */
+    for (ll = 1; ll <= nsteps; ll++) {
 #ifdef DEBUG
-                       if (idebug) {
-                               prout(cramlc(neither, nextx, nexty));
-                       }
+       if (idebug) {
+           prout("%d", ll);
+       }
 #endif
+       /* Check if preferred position available */
+       lookx = nextx + mx;
+       looky = nexty + my;
+       krawlx = mx < 0 ? 1 : -1;
+       krawly = my < 0 ? 1 : -1;
+       success = 0;
+       attempts = 0; /* Settle mysterious hang problem */
+       while (attempts++ < 20 && !success) {
+           if (lookx < 1 || lookx > QUADSIZE) {
+               if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
+                   return;
+               if (krawlx == mx || my == 0) break;
+               lookx = nextx + krawlx;
+               krawlx = -krawlx;
+           }
+           else if (looky < 1 || looky > QUADSIZE) {
+               if (motion < 0 && tryexit(lookx, looky, ienm, loccom, irun))
+                   return;
+               if (krawly == my || mx == 0) break;
+               looky = nexty + krawly;
+               krawly = -krawly;
+           }
+           else if (game.quad[lookx][looky] != IHDOT) {
+               /* See if we should ram ship */
+               if (game.quad[lookx][looky] == ship &&
+                   (ienm == IHC || ienm == IHS)) {
+                   ram(1, ienm, comx, comy);
+                   return;
                }
-               else break; /* done early */
-       }
-       /* Put commander in place within same quadrant */
-       game.quad[comx][comy] = IHDOT;
-       game.quad[nextx][nexty] = ienm;
-       if (nextx != comx || nexty != comy) {
-               /* it moved */
-               game.kx[loccom] = nextx;
-               game.ky[loccom] = nexty;
-               game.kdist[loccom] = game.kavgd[loccom] =
-                                       sqrt(square(sectx-nextx)+square(secty-nexty));
-               if (game.damage[DSRSENS] == 0 || condit == IHDOCKED) {
-                       proutn("***");
-                       cramen(ienm);
-                       proutn(" from %s", cramlc(2, comx, comy));
-                       if (game.kdist[loccom] < dist1) proutn(" advances to ");
-                       else proutn(" retreats to ");
-                       prout(cramlc(sector, nextx, nexty));
+               if (krawlx != mx && my != 0) {
+                   lookx = nextx + krawlx;
+                   krawlx = -krawlx;
                }
+               else if (krawly != my && mx != 0) {
+                   looky = nexty + krawly;
+                   krawly = -krawly;
+               }
+               else break; /* we have failed */
+           }
+           else success = 1;
+       }
+       if (success) {
+           nextx = lookx;
+           nexty = looky;
+#ifdef DEBUG
+           if (idebug) {
+               prout(cramlc(neither, nextx, nexty));
+           }
+#endif
        }
+       else break; /* done early */
+    }
+    /* Put commander in place within same quadrant */
+    game.quad[comx][comy] = IHDOT;
+    game.quad[nextx][nexty] = ienm;
+    if (nextx != comx || nexty != comy) {
+       /* it moved */
+       game.kx[loccom] = nextx;
+       game.ky[loccom] = nexty;
+       game.kdist[loccom] = game.kavgd[loccom] =
+           sqrt(square(sectx-nextx)+square(secty-nexty));
+       if (game.damage[DSRSENS] == 0 || condit == IHDOCKED) {
+           proutn("***");
+           cramen(ienm);
+           proutn(" from %s", cramlc(2, comx, comy));
+           if (game.kdist[loccom] < dist1) proutn(" advances to ");
+           else proutn(" retreats to ");
+           prout(cramlc(sector, nextx, nexty));
+       }
+    }
 }
 
-void movcom(void) {
-       int ix, iy, i;
+void movcom(void) 
+{
+    int ix, iy, i;
 
 #ifdef DEBUG
-       if (idebug) prout("MOVCOM");
+    if (idebug) prout("MOVCOM");
 #endif
 
-       /* Figure out which Klingon is the commander (or Supercommander)
-          and do move */
-       if (comhere) for (i = 1; i <= nenhere; i++) {
-               ix = game.kx[i];
-               iy = game.ky[i];
-               if (game.quad[ix][iy] == IHC) {
-                       movebaddy(ix, iy, i, IHC);
-                       break;
-               }
+    /* Figure out which Klingon is the commander (or Supercommander)
+       and do move */
+    if (comhere) for (i = 1; i <= nenhere; i++) {
+       ix = game.kx[i];
+       iy = game.ky[i];
+       if (game.quad[ix][iy] == IHC) {
+           movebaddy(ix, iy, i, IHC);
+           break;
        }
-       if (ishere) for (i = 1; i <= nenhere; i++) {
-               ix = game.kx[i];
-               iy = game.ky[i];
-               if (game.quad[ix][iy] == IHS) {
-                       movebaddy(ix, iy, i, IHS);
-                       break;
-               }
+    }
+    if (ishere) for (i = 1; i <= nenhere; i++) {
+       ix = game.kx[i];
+       iy = game.ky[i];
+       if (game.quad[ix][iy] == IHS) {
+           movebaddy(ix, iy, i, IHS);
+           break;
        }
-       /* if skill level is high, move other Klingons and Romulans too!
-          Move these last so they can base their actions on what the
+    }
+    /* if skill level is high, move other Klingons and Romulans too!
+       Move these last so they can base their actions on what the
        commander(s) do. */
-       if (skill > 3) for (i = 1; i <= nenhere; i++) {
-               ix = game.kx[i];
-               iy = game.ky[i];
-               if (game.quad[ix][iy] == IHK || game.quad[ix][iy] == IHR)
-                       movebaddy(ix, iy, i, game.quad[ix][iy]);
-       }
+    if (skill >= SKILL_EXPERT) for (i = 1; i <= nenhere; i++) {
+       ix = game.kx[i];
+       iy = game.ky[i];
+       if (game.quad[ix][iy] == IHK || game.quad[ix][iy] == IHR)
+           movebaddy(ix, iy, i, game.quad[ix][iy]);
+    }
 
-       sortkl();
+    sortkl();
 }
 
-static int movescom(int iqx, int iqy, int flag, int *ipage) {
-       int i;
+static int movescom(int iqx, int iqy, int flag, int *ipage) 
+{
+    int i;
 
-       if ((iqx==quadx && iqy==quady) ||
-               iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE ||
-               game.state.galaxy[iqx][iqy] > 899) return 1;
-       if (flag) {
-               /* Avoid quadrants with bases if we want to avoid Enterprise */
-               for (i = 1; i <= game.state.rembase; i++)
-                       if (game.state.baseqx[i]==iqx && game.state.baseqy[i]==iqy) return 1;
-       }
-       if (justin && !iscate) return 1;
-       /* do the move */
-       game.state.galaxy[game.state.isx][game.state.isy] -= ENEMY_PLACE;
-       game.state.isx = iqx;
-       game.state.isy = iqy;
-       game.state.galaxy[game.state.isx][game.state.isy] += ENEMY_PLACE;
-       if (ishere) {
-               /* SC has scooted, Remove him from current quadrant */
-               iscate=0;
-               isatb=0;
-               ishere=0;
-               ientesc=0;
-               game.future[FSCDBAS]=1e30;
-               for (i = 1; i <= nenhere; i++) 
-                       if (game.quad[game.kx[i]][game.ky[i]] == IHS) break;
-               game.quad[game.kx[i]][game.ky[i]] = IHDOT;
-               game.kx[i] = game.kx[nenhere];
-               game.ky[i] = game.ky[nenhere];
-               game.kdist[i] = game.kdist[nenhere];
-               game.kavgd[i] = game.kavgd[nenhere];
-               game.kpower[i] = game.kpower[nenhere];
-               klhere--;
-               nenhere--;
-               if (condit!=IHDOCKED) newcnd();
-               sortkl();
-       }
-       /* check for a helpful planet */
-       for (i = 0; i < inplan; i++) {
-               if (game.state.plnets[i].x==game.state.isx && game.state.plnets[i].y==game.state.isy &&
-                       game.state.plnets[i].crystals == 1) {
-                       /* destroy the planet */
-                       DESTROY(&game.state.plnets[i]);
-                       game.state.newstuf[game.state.isx][game.state.isy] -= 1;
-                       if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) {
-                               if (*ipage==0) pause_game(1);
-                               *ipage = 1;
-                               prout("Lt. Uhura-  \"Captain, Starfleet Intelligence reports");
-                               proutn("   a planet in ");
-                               proutn(cramlc(quadrant, game.state.isx, game.state.isy));
-                               prout(" has been destroyed");
-                               prout("   by the Super-commander.\"");
-                       }
-                       break;
-               }
+    if ((iqx==quadx && iqy==quady) ||
+       iqx < 1 || iqx > GALSIZE || iqy < 1 || iqy > GALSIZE ||
+       NOEXIT(game.state.galaxy[iqx][iqy])) return 1;
+    if (flag) {
+       /* Avoid quadrants with bases if we want to avoid Enterprise */
+       for (i = 1; i <= game.state.rembase; i++)
+           if (game.state.baseqx[i]==iqx && game.state.baseqy[i]==iqy) return 1;
+    }
+    if (justin && !iscate) return 1;
+    /* do the move */
+    game.state.galaxy[game.state.isx][game.state.isy] -= KLINGON_PLACE;
+    game.state.isx = iqx;
+    game.state.isy = iqy;
+    game.state.galaxy[game.state.isx][game.state.isy] += KLINGON_PLACE;
+    if (ishere) {
+       /* SC has scooted, Remove him from current quadrant */
+       iscate=0;
+       isatb=0;
+       ishere=0;
+       ientesc=0;
+       game.future[FSCDBAS]=1e30;
+       for (i = 1; i <= nenhere; i++) 
+           if (game.quad[game.kx[i]][game.ky[i]] == IHS) break;
+       game.quad[game.kx[i]][game.ky[i]] = IHDOT;
+       game.kx[i] = game.kx[nenhere];
+       game.ky[i] = game.ky[nenhere];
+       game.kdist[i] = game.kdist[nenhere];
+       game.kavgd[i] = game.kavgd[nenhere];
+       game.kpower[i] = game.kpower[nenhere];
+       klhere--;
+       nenhere--;
+       if (condit!=IHDOCKED) newcnd();
+       sortkl();
+    }
+    /* check for a helpful planet */
+    for (i = 0; i < inplan; i++) {
+       if (game.state.plnets[i].x==game.state.isx && game.state.plnets[i].y==game.state.isy &&
+           game.state.plnets[i].crystals == 1) {
+           /* destroy the planet */
+           DESTROY(&game.state.plnets[i]);
+           game.state.newstuf[game.state.isx][game.state.isy] -= 1;
+           if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) {
+               if (*ipage==0) pause_game(1);
+               *ipage = 1;
+               prout("Lt. Uhura-  \"Captain, Starfleet Intelligence reports");
+               proutn("   a planet in ");
+               proutn(cramlc(quadrant, game.state.isx, game.state.isy));
+               prout(" has been destroyed");
+               prout("   by the Super-commander.\"");
+           }
+           break;
        }
-       return 0; /* looks good! */
+    }
+    return 0; /* looks good! */
 }
                        
-               
-       
-
-
-void scom(int *ipage) {
-       int i, i2, j, ideltax, ideltay, ibqx, ibqy, sx, sy, ifindit, iwhichb;
-       int iqx, iqy;
-       int basetbl[BASEMAX];
-       double bdist[BASEMAX];
-       int flag;
+void scom(int *ipage)
+{
+    int i, i2, j, ideltax, ideltay, ibqx, ibqy, sx, sy, ifindit, iwhichb;
+    int iqx, iqy;
+    int basetbl[BASEMAX];
+    double bdist[BASEMAX];
+    int flag;
 #ifdef DEBUG
-       if (idebug) prout("SCOM");
+    if (idebug) prout("SCOM");
 #endif
 
-       /* Decide on being active or passive */
-       flag = ((game.state.killc+game.state.killk)/(game.state.date+0.01-indate) < 0.1*skill*(skill+1.0) ||
-                       (game.state.date-indate) < 3.0);
-       if (iscate==0 && flag) {
-               /* compute move away from Enterprise */
-               ideltax = game.state.isx-quadx;
-               ideltay = game.state.isy-quady;
-               if (sqrt(ideltax*(double)ideltax+ideltay*(double)ideltay) > 2.0) {
-                       /* circulate in space */
-                       ideltax = game.state.isy-quady;
-                       ideltay = quadx-game.state.isx;
-               }
+    /* Decide on being active or passive */
+    flag = ((game.state.killc+game.state.killk)/(game.state.date+0.01-indate) < 0.1*skill*(skill+1.0) ||
+           (game.state.date-indate) < 3.0);
+    if (iscate==0 && flag) {
+       /* compute move away from Enterprise */
+       ideltax = game.state.isx-quadx;
+       ideltay = game.state.isy-quady;
+       if (sqrt(ideltax*(double)ideltax+ideltay*(double)ideltay) > 2.0) {
+           /* circulate in space */
+           ideltax = game.state.isy-quady;
+           ideltay = quadx-game.state.isx;
        }
-       else {
-               /* compute distances to starbases */
-               if (game.state.rembase <= 0) {
-                       /* nothing left to do */
-                       game.future[FSCMOVE] = 1e30;
-                       return;
-               }
-               sx = game.state.isx;
-               sy = game.state.isy;
-               for (i = 1; i <= game.state.rembase; i++) {
-                       basetbl[i] = i;
-                       ibqx = game.state.baseqx[i];
-                       ibqy = game.state.baseqy[i];
-                       bdist[i] = sqrt(square(ibqx-sx) + square(ibqy-sy));
-               }
-               if (game.state.rembase > 1) {
-                       /* sort into nearest first order */
-                       int iswitch;
-                       do {
-                               iswitch = 0;
-                               for (i=1; i < game.state.rembase-1; i++) {
-                                       if (bdist[i] > bdist[i+1]) {
-                                               int ti = basetbl[i];
-                                               double t = bdist[i];
-                                               bdist[i] = bdist[i+1];
-                                               bdist[i+1] = t;
-                                               basetbl[i] = basetbl[i+1];
-                                               basetbl[i+1] =ti;
-                                               iswitch = 1;
-                                       }
-                               }
-                       } while (iswitch);
+    }
+    else {
+       /* compute distances to starbases */
+       if (game.state.rembase <= 0) {
+           /* nothing left to do */
+           game.future[FSCMOVE] = 1e30;
+           return;
+       }
+       sx = game.state.isx;
+       sy = game.state.isy;
+       for (i = 1; i <= game.state.rembase; i++) {
+           basetbl[i] = i;
+           ibqx = game.state.baseqx[i];
+           ibqy = game.state.baseqy[i];
+           bdist[i] = sqrt(square(ibqx-sx) + square(ibqy-sy));
+       }
+       if (game.state.rembase > 1) {
+           /* sort into nearest first order */
+           int iswitch;
+           do {
+               iswitch = 0;
+               for (i=1; i < game.state.rembase-1; i++) {
+                   if (bdist[i] > bdist[i+1]) {
+                       int ti = basetbl[i];
+                       double t = bdist[i];
+                       bdist[i] = bdist[i+1];
+                       bdist[i+1] = t;
+                       basetbl[i] = basetbl[i+1];
+                       basetbl[i+1] =ti;
+                       iswitch = 1;
+                   }
                }
-               /* look for nearest base without a commander, no Enterprise, and
-                  without too many Klingons, and not already under attack. */
-               ifindit = iwhichb = 0;
+           } while (iswitch);
+       }
+       /* look for nearest base without a commander, no Enterprise, and
+          without too many Klingons, and not already under attack. */
+       ifindit = iwhichb = 0;
 
-               for (i2 = 1; i2 <= game.state.rembase; i2++) {
-                       i = basetbl[i2];        /* bug in original had it not finding nearest*/
-                       ibqx = game.state.baseqx[i];
-                       ibqy = game.state.baseqy[i];
-                       if ((ibqx == quadx && ibqy == quady) ||
-                               (ibqx == batx && ibqy == baty) ||
-                               game.state.galaxy[ibqx][ibqy] > 899) continue;
-                       /* if there is a commander, an no other base is appropriate,
-                          we will take the one with the commander */
-                       for (j = 1; j <= game.state.remcom; j++) {
-                               if (ibqx==game.state.cx[j] && ibqy==game.state.cy[j] && ifindit!= 2) {
-                                               ifindit = 2;
-                                               iwhichb = i;
-                                               break;
-                               }
-                       }
-                       if (j > game.state.remcom) { /* no commander -- use this one */
-                               ifindit = 1;
-                               iwhichb = i;
-                               break;
-                       }
+       for (i2 = 1; i2 <= game.state.rembase; i2++) {
+           i = basetbl[i2];    /* bug in original had it not finding nearest*/
+           ibqx = game.state.baseqx[i];
+           ibqy = game.state.baseqy[i];
+           if ((ibqx == quadx && ibqy == quady) ||
+               (ibqx == batx && ibqy == baty) ||
+               NOEXIT(game.state.galaxy[ibqx][ibqy])) continue;
+           /* if there is a commander, an no other base is appropriate,
+              we will take the one with the commander */
+           for (j = 1; j <= game.state.remcom; j++) {
+               if (ibqx==game.state.cx[j] && ibqy==game.state.cy[j] && ifindit!= 2) {
+                   ifindit = 2;
+                   iwhichb = i;
+                   break;
                }
-               if (ifindit==0) return; /* Nothing suitable -- wait until next time*/
-               ibqx = game.state.baseqx[iwhichb];
-               ibqy = game.state.baseqy[iwhichb];
-               /* decide how to move toward base */
-               ideltax = ibqx - game.state.isx;
-               ideltay = ibqy - game.state.isy;
+           }
+           if (j > game.state.remcom) { /* no commander -- use this one */
+               ifindit = 1;
+               iwhichb = i;
+               break;
+           }
        }
-       /* Maximum movement is 1 quadrant in either or both axis */
-       if (ideltax > 1) ideltax = 1;
-       if (ideltax < -1) ideltax = -1;
-       if (ideltay > 1) ideltay = 1;
-       if (ideltay < -1) ideltay = -1;
+       if (ifindit==0) return; /* Nothing suitable -- wait until next time*/
+       ibqx = game.state.baseqx[iwhichb];
+       ibqy = game.state.baseqy[iwhichb];
+       /* decide how to move toward base */
+       ideltax = ibqx - game.state.isx;
+       ideltay = ibqy - game.state.isy;
+    }
+    /* Maximum movement is 1 quadrant in either or both axis */
+    if (ideltax > 1) ideltax = 1;
+    if (ideltax < -1) ideltax = -1;
+    if (ideltay > 1) ideltay = 1;
+    if (ideltay < -1) ideltay = -1;
 
-       /* try moving in both x and y directions */
-       iqx = game.state.isx + ideltax;
-       iqy = game.state.isy + ideltax;
-       if (movescom(iqx, iqy, flag, ipage)) {
-               /* failed -- try some other maneuvers */
-               if (ideltax==0 || ideltay==0) {
-                       /* attempt angle move */
-                       if (ideltax != 0) {
-                               iqy = game.state.isy + 1;
-                               if (movescom(iqx, iqy, flag, ipage)) {
-                                       iqy = game.state.isy - 1;
-                                       movescom(iqx, iqy, flag, ipage);
-                               }
-                       }
-                       else {
-                               iqx = game.state.isx + 1;
-                               if (movescom(iqx, iqy, flag, ipage)) {
-                                       iqx = game.state.isx - 1;
-                                       movescom(iqx, iqy, flag, ipage);
-                               }
-                       }
+    /* try moving in both x and y directions */
+    iqx = game.state.isx + ideltax;
+    iqy = game.state.isy + ideltax;
+    if (movescom(iqx, iqy, flag, ipage)) {
+       /* failed -- try some other maneuvers */
+       if (ideltax==0 || ideltay==0) {
+           /* attempt angle move */
+           if (ideltax != 0) {
+               iqy = game.state.isy + 1;
+               if (movescom(iqx, iqy, flag, ipage)) {
+                   iqy = game.state.isy - 1;
+                   movescom(iqx, iqy, flag, ipage);
                }
-               else {
-                       /* try moving just in x or y */
-                       iqy = game.state.isy;
-                       if (movescom(iqx, iqy, flag, ipage)) {
-                               iqy = game.state.isy + ideltay;
-                               iqx = game.state.isx;
-                               movescom(iqx, iqy, flag, ipage);
-                       }
+           }
+           else {
+               iqx = game.state.isx + 1;
+               if (movescom(iqx, iqy, flag, ipage)) {
+                   iqx = game.state.isx - 1;
+                   movescom(iqx, iqy, flag, ipage);
                }
+           }
        }
-       /* check for a base */
-       if (game.state.rembase == 0) {
-               game.future[FSCMOVE] = 1e30;
+       else {
+           /* try moving just in x or y */
+           iqy = game.state.isy;
+           if (movescom(iqx, iqy, flag, ipage)) {
+               iqy = game.state.isy + ideltay;
+               iqx = game.state.isx;
+               movescom(iqx, iqy, flag, ipage);
+           }
        }
-       else for (i=1; i<=game.state.rembase; i++) {
-               ibqx = game.state.baseqx[i];
-               ibqy = game.state.baseqy[i];
-               if (ibqx==game.state.isx && ibqy == game.state.isy && game.state.isx != batx && game.state.isy != baty) {
-                       /* attack the base */
-                       if (flag) return; /* no, don't attack base! */
-                       iseenit = 0;
-                       isatb=1;
-                       game.future[FSCDBAS] = game.state.date + 1.0 +2.0*Rand();
-                       if (game.future[FCDBAS] < 1e30) game.future[FSCDBAS] +=
-                               game.future[FCDBAS]-game.state.date;
-                       if (game.damage[DRADIO] > 0 && condit != IHDOCKED)
-                               return; /* no warning */
-                       iseenit = 1;
-                       if (*ipage == 0)  pause_game(1);
-                       *ipage=1;
-                       proutn("Lt. Uhura-  \"Captain, the starbase in ");
-                       proutn(cramlc(quadrant, game.state.isx, game.state.isy));
-                       skip(1);
-                       prout("   reports that it is under attack from the Klingon Super-commander.");
-                       proutn("   It can survive until stardate %d.\"",
-                              (int)game.future[FSCDBAS]);
-                       if (resting==0) return;
-                       prout("Mr. Spock-  \"Captain, shall we cancel the rest period?\"");
-                       if (ja()==0) return;
-                       resting = 0;
-                       Time = 0.0; /* actually finished */
-                       return;
-               }
+    }
+    /* check for a base */
+    if (game.state.rembase == 0) {
+       game.future[FSCMOVE] = 1e30;
+    }
+    else for (i=1; i<=game.state.rembase; i++) {
+       ibqx = game.state.baseqx[i];
+       ibqy = game.state.baseqy[i];
+       if (ibqx==game.state.isx && ibqy == game.state.isy && game.state.isx != batx && game.state.isy != baty) {
+           /* attack the base */
+           if (flag) return; /* no, don't attack base! */
+           iseenit = 0;
+           isatb=1;
+           game.future[FSCDBAS] = game.state.date + 1.0 +2.0*Rand();
+           if (game.future[FCDBAS] < 1e30) game.future[FSCDBAS] +=
+               game.future[FCDBAS]-game.state.date;
+           if (game.damage[DRADIO] > 0 && condit != IHDOCKED)
+               return; /* no warning */
+           iseenit = 1;
+           if (*ipage == 0)  pause_game(1);
+           *ipage=1;
+           proutn("Lt. Uhura-  \"Captain, the starbase in ");
+           proutn(cramlc(quadrant, game.state.isx, game.state.isy));
+           skip(1);
+           prout("   reports that it is under attack from the Klingon Super-commander.");
+           proutn("   It can survive until stardate %d.\"",
+                  (int)game.future[FSCDBAS]);
+           if (resting==0) return;
+           prout("Mr. Spock-  \"Captain, shall we cancel the rest period?\"");
+           if (ja()==0) return;
+           resting = 0;
+           Time = 0.0; /* actually finished */
+           return;
        }
-       /* Check for intelligence report */
-       if (
+    }
+    /* Check for intelligence report */
+    if (
 #ifdef DEBUG
-               idebug==0 &&
+       idebug==0 &&
 #endif
-               (Rand() > 0.2 ||
-                (game.damage[DRADIO] > 0.0 && condit != IHDOCKED) ||
-                game.starch[game.state.isx][game.state.isy] > 0))
-               return;
-       if (*ipage==0) pause_game(1);
-       *ipage = 1;
-       prout("Lt. Uhura-  \"Captain, Starfleet Intelligence reports");
-       proutn("   the Super-commander is in ");
-       proutn(cramlc(quadrant, game.state.isx, game.state. isy));
-       prout(".\"");
+       (Rand() > 0.2 ||
+        (game.damage[DRADIO] > 0.0 && condit != IHDOCKED) ||
+        game.starch[game.state.isx][game.state.isy] > 0))
        return;
+    if (*ipage==0) pause_game(1);
+    *ipage = 1;
+    prout("Lt. Uhura-  \"Captain, Starfleet Intelligence reports");
+    proutn("   the Super-commander is in ");
+    proutn(cramlc(quadrant, game.state.isx, game.state. isy));
+    prout(".\"");
+    return;
 }
 
-void movetho(void) {
-       int idx, idy, im, i, dum, my;
-       /* Move the Tholian */
-       if (ithere==0 || justin == 1) return;
+void movetho(void)
+{
+    int idx, idy, im, i, dum, my;
+    /* Move the Tholian */
+    if (ithere==0 || justin == 1) return;
 
-       if (ithx == 1 && ithy == 1) {
-               idx = 1; idy = QUADSIZE;
-       }
-       else if (ithx == 1 && ithy == QUADSIZE) {
-               idx = QUADSIZE; idy = QUADSIZE;
-       }
-       else if (ithx == QUADSIZE && ithy == QUADSIZE) {
-               idx = QUADSIZE; idy = 1;
-       }
-       else if (ithx == QUADSIZE && ithy == 1) {
-               idx = 1; idy = 1;
-       }
-       else {
-               /* something is wrong! */
-               ithere = 0;
-               return;
-       }
+    if (ithx == 1 && ithy == 1) {
+       idx = 1; idy = QUADSIZE;
+    }
+    else if (ithx == 1 && ithy == QUADSIZE) {
+       idx = QUADSIZE; idy = QUADSIZE;
+    }
+    else if (ithx == QUADSIZE && ithy == QUADSIZE) {
+       idx = QUADSIZE; idy = 1;
+    }
+    else if (ithx == QUADSIZE && ithy == 1) {
+       idx = 1; idy = 1;
+    }
+    else {
+       /* something is wrong! */
+       ithere = 0;
+       return;
+    }
 
-       /* Do nothing if we are blocked */
-       if (game.quad[idx][idy]!= IHDOT && game.quad[idx][idy]!= IHWEB) return;
-       game.quad[ithx][ithy] = IHWEB;
+    /* Do nothing if we are blocked */
+    if (game.quad[idx][idy]!= IHDOT && game.quad[idx][idy]!= IHWEB) return;
+    game.quad[ithx][ithy] = IHWEB;
 
-       if (ithx != idx) {
-               /* move in x axis */
-               im = fabs((double)idx - ithx)/((double)idx - ithx);
-               while (ithx != idx) {
-                       ithx += im;
-                       if (game.quad[ithx][ithy]==IHDOT) game.quad[ithx][ithy] = IHWEB;
-               }
+    if (ithx != idx) {
+       /* move in x axis */
+       im = fabs((double)idx - ithx)/((double)idx - ithx);
+       while (ithx != idx) {
+           ithx += im;
+           if (game.quad[ithx][ithy]==IHDOT) game.quad[ithx][ithy] = IHWEB;
        }
-       else if (ithy != idy) {
-               /* move in y axis */
-               im = fabs((double)idy - ithy)/((double)idy - ithy);
-               while (ithy != idy) {
-                       ithy += im;
-                       if (game.quad[ithx][ithy]==IHDOT) game.quad[ithx][ithy] = IHWEB;
-               }
+    }
+    else if (ithy != idy) {
+       /* move in y axis */
+       im = fabs((double)idy - ithy)/((double)idy - ithy);
+       while (ithy != idy) {
+           ithy += im;
+           if (game.quad[ithx][ithy]==IHDOT) game.quad[ithx][ithy] = IHWEB;
        }
-       game.quad[ithx][ithy] = IHT;
-        game.kx[nenhere]=ithx;
-        game.ky[nenhere]=ithy;
+    }
+    game.quad[ithx][ithy] = IHT;
+    game.kx[nenhere]=ithx;
+    game.ky[nenhere]=ithy;
 
-       /* check to see if all holes plugged */
-       for (i = 1; i < QUADSIZE+1; i++) {
-               if (game.quad[1][i]!=IHWEB && game.quad[1][i]!=IHT) return;
-               if (game.quad[QUADSIZE][i]!=IHWEB && game.quad[QUADSIZE][i]!=IHT) return;
-               if (game.quad[i][1]!=IHWEB && game.quad[i][1]!=IHT) return;
-               if (game.quad[i][QUADSIZE]!=IHWEB && game.quad[i][QUADSIZE]!=IHT) return;
-       }
-       /* All plugged up -- Tholian splits */
-       game.quad[ithx][ithy]=IHWEB;
-       dropin(IHBLANK, &dum, &my);
-       crmena(1,IHT, 2, ithx, ithy);
-       prout(" completes web.");
-       ithere = ithx = ithy = 0;
-       nenhere--;
-       return;
+    /* check to see if all holes plugged */
+    for (i = 1; i < QUADSIZE+1; i++) {
+       if (game.quad[1][i]!=IHWEB && game.quad[1][i]!=IHT) return;
+       if (game.quad[QUADSIZE][i]!=IHWEB && game.quad[QUADSIZE][i]!=IHT) return;
+       if (game.quad[i][1]!=IHWEB && game.quad[i][1]!=IHT) return;
+       if (game.quad[i][QUADSIZE]!=IHWEB && game.quad[i][QUADSIZE]!=IHT) return;
+    }
+    /* All plugged up -- Tholian splits */
+    game.quad[ithx][ithy]=IHWEB;
+    dropin(IHBLANK, &dum, &my);
+    crmena(1,IHT, 2, ithx, ithy);
+    prout(" completes web.");
+    ithere = ithx = ithy = 0;
+    nenhere--;
+    return;
 }
index 36a6cfa7a126273f4de9cd872c3dc5a56a94418c..f539c3fd375eee8ed583aa4b0395a7ee2f8b5d93 100644 (file)
--- a/battle.c
+++ b/battle.c
 #include <unistd.h>
 #include "sst.h"
 
-void doshield(int i) {
-       int key;
-       enum {NONE, SHUP, SHDN, NRG} action = NONE;
+void doshield(int i) 
+{
+    int key;
+    enum {NONE, SHUP, SHDN, NRG} action = NONE;
 
-       ididit = 0;
+    ididit = 0;
 
-       if (i == 2) action = SHUP;
-       else {
-               key = scan();
-               if (key == IHALPHA) {
-                       if (isit("transfer"))
-                               action = NRG;
-                       else {
-                               chew();
-                               if (game.damage[DSHIELD]) {
-                                       prout("Shields damaged and down.");
-                                       return;
-                               }
-                               if (isit("up"))
-                                       action = SHUP;
-                               else if (isit("down"))
-                                       action = SHDN;
-                       }
+    if (i == 2) action = SHUP;
+    else {
+       key = scan();
+       if (key == IHALPHA) {
+           if (isit("transfer"))
+               action = NRG;
+           else {
+               chew();
+               if (game.damage[DSHIELD]) {
+                   prout("Shields damaged and down.");
+                   return;
+               }
+               if (isit("up"))
+                   action = SHUP;
+               else if (isit("down"))
+                   action = SHDN;
+           }
+       }
+       if (action==NONE) {
+           proutn("Do you wish to change shield energy? ");
+           if (ja()) {
+               proutn("Energy to transfer to shields- ");
+               action = NRG;
+           }
+           else if (game.damage[DSHIELD]) {
+               prout("Shields damaged and down.");
+               return;
+           }
+           else if (shldup) {
+               proutn("Shields are up. Do you want them down? ");
+               if (ja()) action = SHDN;
+               else {
+                   chew();
+                   return;
                }
-               if (action==NONE) {
-                       proutn("Do you wish to change shield energy? ");
-                       if (ja()) {
-                               proutn("Energy to transfer to shields- ");
-                               action = NRG;
-                       }
-                       else if (game.damage[DSHIELD]) {
-                               prout("Shields damaged and down.");
-                               return;
-                       }
-                       else if (shldup) {
-                               proutn("Shields are up. Do you want them down? ");
-                               if (ja()) action = SHDN;
-                               else {
-                                       chew();
-                                       return;
-                               }
-                       }
-                       else {
-                               proutn("Shields are down. Do you want them up? ");
-                               if (ja()) action = SHUP;
-                               else {
-                                       chew();
-                                       return;
-                               }
-                       }
+           }
+           else {
+               proutn("Shields are down. Do you want them up? ");
+               if (ja()) action = SHUP;
+               else {
+                   chew();
+                   return;
                }
+           }
        }
-       switch (action) {
-               case SHUP: /* raise shields */
-                       if (shldup) {
-                               prout("Shields already up.");
-                               return;
-                       }
-                       shldup = 1;
-                       shldchg = 1;
-                       if (condit != IHDOCKED) energy -= 50.0;
-                       prout("Shields raised.");
-                       if (energy <= 0) {
-                               skip(1);
-                               prout("Shields raising uses up last of energy.");
-                               finish(FNRG);
-                               return;
-                       }
-                       ididit=1;
-                       return;
-               case SHDN:
-                       if (shldup==0) {
-                               prout("Shields already down.");
-                               return;
-                       }
-                       shldup=0;
-                       shldchg=1;
-                       prout("Shields lowered.");
-                       ididit=1;
-                       return;
-               case NRG:
-                       while (scan() != IHREAL) {
-                               chew();
-                               proutn("Energy to transfer to shields- ");
-                       }
-                       chew();
-                       if (aaitem==0) return;
-                       if (aaitem > energy) {
-                               prout("Insufficient ship energy.");
-                               return;
-                       }
-                       ididit = 1;
-                       if (shield+aaitem >= inshld) {
-                               prout("Shield energy maximized.");
-                               if (shield+aaitem > inshld) {
-                                       prout("Excess energy requested returned to ship energy");
-                               }
-                               energy -= inshld-shield;
-                               shield = inshld;
-                               return;
-                       }
-                       if (aaitem < 0.0 && energy-aaitem > inenrg) {
-                               /* Prevent shield drain loophole */
-                               skip(1);
-                               prout("Engineering to bridge--");
-                               prout("  Scott here. Power circuit problem, Captain.");
-                               prout("  I can't drain the shields.");
-                               ididit = 0;
-                               return;
-                       }
-                       if (shield+aaitem < 0) {
-                               prout("All shield energy transferred to ship.");
-                               energy += shield;
-                               shield = 0.0;
-                               return;
-                       }
-                       proutn("Scotty- \"");
-                       if (aaitem > 0)
-                               prout("Transferring energy to shields.\"");
-                       else
-                               prout("Draining energy from shields.\"");
-                       shield += aaitem;
-                       energy -= aaitem;
-                       return;
-               case NONE:;     /* avoid gcc warning */
+    }
+    switch (action) {
+    case SHUP: /* raise shields */
+       if (shldup) {
+           prout("Shields already up.");
+           return;
        }
-}
-
-void ram(int ibumpd, int ienm, int ix, int iy) {
-       double type = 1.0, extradm;
-       int icas, l;
-       
-       prouts("***RED ALERT!  RED ALERT!");
-       skip(1);
-       prout("***COLLISION IMMINENT.");
-       skip(2);
-       proutn("***");
-       crmshp();
-       switch (ienm) {
-               case IHR: type = 1.5; break;
-               case IHC: type = 2.0; break;
-               case IHS: type = 2.5; break;
-               case IHT: type = 0.5; break;
-                case IHQUEST: type = 4.0; break;
+       shldup = 1;
+       shldchg = 1;
+       if (condit != IHDOCKED) energy -= 50.0;
+       prout("Shields raised.");
+       if (energy <= 0) {
+           skip(1);
+           prout("Shields raising uses up last of energy.");
+           finish(FNRG);
+           return;
        }
-       proutn(ibumpd ? " rammed by " : " rams ");
-       crmena(0, ienm, 2, ix, iy);
-       if (ibumpd) proutn(" (original position)");
-       skip(1);
-       deadkl(ix, iy, ienm, sectx, secty);
-       proutn("***");
-       crmshp();
-       prout(" heavily damaged.");
-       icas = 10.0+20.0*Rand();
-       prout("***Sickbay reports %d casualties", icas);
-       casual += icas;
-       for (l=1; l <= NDEVICES; l++) {
-               if (l == DDRAY) continue; // Don't damage deathray 
-               if (game.damage[l] < 0) continue;
-               extradm = (10.0*type*Rand()+1.0)*damfac;
-               game.damage[l] += Time + extradm; /* Damage for at least time of travel! */
+       ididit=1;
+       return;
+    case SHDN:
+       if (shldup==0) {
+           prout("Shields already down.");
+           return;
+       }
+       shldup=0;
+       shldchg=1;
+       prout("Shields lowered.");
+       ididit=1;
+       return;
+    case NRG:
+       while (scan() != IHREAL) {
+           chew();
+           proutn("Energy to transfer to shields- ");
+       }
+       chew();
+       if (aaitem==0) return;
+       if (aaitem > energy) {
+           prout("Insufficient ship energy.");
+           return;
+       }
+       ididit = 1;
+       if (shield+aaitem >= inshld) {
+           prout("Shield energy maximized.");
+           if (shield+aaitem > inshld) {
+               prout("Excess energy requested returned to ship energy");
+           }
+           energy -= inshld-shield;
+           shield = inshld;
+           return;
+       }
+       if (aaitem < 0.0 && energy-aaitem > inenrg) {
+           /* Prevent shield drain loophole */
+           skip(1);
+           prout("Engineering to bridge--");
+           prout("  Scott here. Power circuit problem, Captain.");
+           prout("  I can't drain the shields.");
+           ididit = 0;
+           return;
        }
-       shldup = 0;
-       if (game.state.remkl) {
-               pause_game(2);
-               dreprt();
+       if (shield+aaitem < 0) {
+           prout("All shield energy transferred to ship.");
+           energy += shield;
+           shield = 0.0;
+           return;
        }
-       else finish(FWON);
+       proutn("Scotty- \"");
+       if (aaitem > 0)
+           prout("Transferring energy to shields.\"");
+       else
+           prout("Draining energy from shields.\"");
+       shield += aaitem;
+       energy -= aaitem;
        return;
+    case NONE:;        /* avoid gcc warning */
+    }
 }
 
-void torpedo(double course, double r, int inx, int iny, double *hit, int wait, int i, int n) {
-        int l, iquad=0, ix=0, iy=0, jx=0, jy=0, shoved=0, ll;
+void ram(int ibumpd, int ienm, int ix, int iy)
+{
+    double type = 1.0, extradm;
+    int icas, l;
        
-       double ac=course + 0.25*r;
-       double angle = (15.0-ac)*0.5235988;
-       double bullseye = (15.0 - course)*0.5235988;
-       double deltax=-sin(angle), deltay=cos(angle), x=inx, y=iny, bigger;
-       double ang, temp, xx, yy, kp, h1;
+    prouts("***RED ALERT!  RED ALERT!");
+    skip(1);
+    prout("***COLLISION IMMINENT.");
+    skip(2);
+    proutn("***");
+    crmshp();
+    switch (ienm) {
+    case IHR: type = 1.5; break;
+    case IHC: type = 2.0; break;
+    case IHS: type = 2.5; break;
+    case IHT: type = 0.5; break;
+    case IHQUEST: type = 4.0; break;
+    }
+    proutn(ibumpd ? " rammed by " : " rams ");
+    crmena(0, ienm, 2, ix, iy);
+    if (ibumpd) proutn(" (original position)");
+    skip(1);
+    deadkl(ix, iy, ienm, sectx, secty);
+    proutn("***");
+    crmshp();
+    prout(" heavily damaged.");
+    icas = 10.0+20.0*Rand();
+    prout("***Sickbay reports %d casualties", icas);
+    casual += icas;
+    for (l=1; l <= NDEVICES; l++) {
+       if (l == DDRAY) continue; // Don't damage deathray 
+       if (game.damage[l] < 0) continue;
+       extradm = (10.0*type*Rand()+1.0)*damfac;
+       game.damage[l] += Time + extradm; /* Damage for at least time of travel! */
+    }
+    shldup = 0;
+    if (game.state.remkl) {
+       pause_game(2);
+       dreprt();
+    }
+    else finish(FWON);
+    return;
+}
+
+void torpedo(double course, double r, int inx, int iny, double *hit, int wait, int i, int n) 
+{
+    int l, iquad=0, ix=0, iy=0, jx=0, jy=0, shoved=0, ll;
+       
+    double ac=course + 0.25*r;
+    double angle = (15.0-ac)*0.5235988;
+    double bullseye = (15.0 - course)*0.5235988;
+    double deltax=-sin(angle), deltay=cos(angle), x=inx, y=iny, bigger;
+    double ang, temp, xx, yy, kp, h1;
 
-       bigger = fabs(deltax);
-       if (fabs(deltay) > bigger) bigger = fabs(deltay);
-       deltax /= bigger;
-       deltay /= bigger;
-        if (game.damage[DSRSENS]==0 || condit==IHDOCKED) 
-           setwnd(srscan_window);
-       else 
-           setwnd(message_window);
-       /* Loop to move a single torpedo */
-       for (l=1; l <= 15; l++) {
-               x += deltax;
-               ix = x + 0.5;
-               if (ix < 1 || ix > QUADSIZE) break;
-               y += deltay;
-               iy = y + 0.5;
-               if (iy < 1 || iy > QUADSIZE) break;
-               iquad=game.quad[ix][iy];
-               tracktorpedo(x, y, ix, iy, wait, l, i, n, iquad);
-               wait = 1;
-               if (iquad==IHDOT) continue;
-               /* hit something */
-               setwnd(message_window);
-               skip(1);        /* start new line after text track */
-               switch(iquad) {
-                       case IHE: /* Hit our ship */
-                       case IHF:
-                               skip(1);
-                               proutn("Torpedo hits ");
-                               crmshp();
-                               prout(".");
-                               *hit = 700.0 + 100.0*Rand() -
-                                          1000.0*sqrt(square(ix-inx)+square(iy-iny))*
-                                          fabs(sin(bullseye-angle));
-                               *hit = fabs(*hit);
-                               newcnd(); /* we're blown out of dock */
-                               /* We may be displaced. */
-                               if (landed==1 || condit==IHDOCKED) return; /* Cheat if on a planet */
-                               ang = angle + 2.5*(Rand()-0.5);
-                               temp = fabs(sin(ang));
-                               if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
-                               xx = -sin(ang)/temp;
-                               yy = cos(ang)/temp;
-                               jx=ix+xx+0.5;
-                               jy=iy+yy+0.5;
-                               if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) return;
-                               if (game.quad[jx][jy]==IHBLANK) {
-                                       finish(FHOLE);
-                                       return;
-                               }
-                               if (game.quad[jx][jy]!=IHDOT) {
-                                       /* can't move into object */
-                                       return;
-                               }
-                               sectx = jx;
-                               secty = jy;
-                               crmshp();
-                               shoved = 1;
-                               break;
+    bigger = fabs(deltax);
+    if (fabs(deltay) > bigger) bigger = fabs(deltay);
+    deltax /= bigger;
+    deltay /= bigger;
+    if (game.damage[DSRSENS]==0 || condit==IHDOCKED) 
+       setwnd(srscan_window);
+    else 
+       setwnd(message_window);
+    /* Loop to move a single torpedo */
+    for (l=1; l <= 15; l++) {
+       x += deltax;
+       ix = x + 0.5;
+       if (ix < 1 || ix > QUADSIZE) break;
+       y += deltay;
+       iy = y + 0.5;
+       if (iy < 1 || iy > QUADSIZE) break;
+       iquad=game.quad[ix][iy];
+       tracktorpedo(x, y, ix, iy, wait, l, i, n, iquad);
+       wait = 1;
+       if (iquad==IHDOT) continue;
+       /* hit something */
+       setwnd(message_window);
+       skip(1);        /* start new line after text track */
+       switch(iquad) {
+       case IHE: /* Hit our ship */
+       case IHF:
+           skip(1);
+           proutn("Torpedo hits ");
+           crmshp();
+           prout(".");
+           *hit = 700.0 + 100.0*Rand() -
+               1000.0*sqrt(square(ix-inx)+square(iy-iny))*
+               fabs(sin(bullseye-angle));
+           *hit = fabs(*hit);
+           newcnd(); /* we're blown out of dock */
+           /* We may be displaced. */
+           if (landed==1 || condit==IHDOCKED) return; /* Cheat if on a planet */
+           ang = angle + 2.5*(Rand()-0.5);
+           temp = fabs(sin(ang));
+           if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
+           xx = -sin(ang)/temp;
+           yy = cos(ang)/temp;
+           jx=ix+xx+0.5;
+           jy=iy+yy+0.5;
+           if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) return;
+           if (game.quad[jx][jy]==IHBLANK) {
+               finish(FHOLE);
+               return;
+           }
+           if (game.quad[jx][jy]!=IHDOT) {
+               /* can't move into object */
+               return;
+           }
+           sectx = jx;
+           secty = jy;
+           crmshp();
+           shoved = 1;
+           break;
                                          
-                       case IHC: /* Hit a commander */
-                       case IHS:
-                               if (Rand() <= 0.05) {
-                                       crmena(1, iquad, 2, ix, iy);
-                                       prout(" uses anti-photon device;");
-                                       prout("   torpedo neutralized.");
-                                       return;
-                               }
-                       case IHR: /* Hit a regular enemy */
-                       case IHK:
-                               /* find the enemy */
-                               for (ll=1; ll <= nenhere; ll++)
-                                       if (ix==game.kx[ll] && iy==game.ky[ll]) break;
-                               kp = fabs(game.kpower[ll]);
-                               h1 = 700.0 + 100.0*Rand() -
-                                        1000.0*sqrt(square(ix-inx)+square(iy-iny))*
-                                        fabs(sin(bullseye-angle));
-                               h1 = fabs(h1);
-                               if (kp < h1) h1 = kp;
-                               game.kpower[ll] -= (game.kpower[ll]<0 ? -h1 : h1);
-                               if (game.kpower[ll] == 0) {
-                                       deadkl(ix, iy, iquad, ix, iy);
-                                       return;
-                               }
-                               crmena(1, iquad, 2, ix, iy);
-                               /* If enemy damaged but not destroyed, try to displace */
-                               ang = angle + 2.5*(Rand()-0.5);
-                               temp = fabs(sin(ang));
-                               if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
-                               xx = -sin(ang)/temp;
-                               yy = cos(ang)/temp;
-                               jx=ix+xx+0.5;
-                               jy=iy+yy+0.5;
-                               if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) {
-                                       prout(" damaged but not destroyed.");
-                                       return;
-                               }
-                               if (game.quad[jx][jy]==IHBLANK) {
-                                       prout(" buffeted into black hole.");
-                                       deadkl(ix, iy, iquad, jx, jy);
-                                       return;
-                               }
-                               if (game.quad[jx][jy]!=IHDOT) {
-                                       /* can't move into object */
-                                       prout(" damaged but not destroyed.");
-                                       return;
-                               }
-                               proutn(" damaged--");
-                               game.kx[ll] = jx;
-                               game.ky[ll] = jy;
-                               shoved = 1;
-                               break;
-                       case IHB: /* Hit a base */
-                               skip(1);
-                               prout("***STARBASE DESTROYED..");
-                               if (game.starch[quadx][quady] < 0) game.starch[quadx][quady] = 0;
-                               for (ll=1; ll<=game.state.rembase; ll++) {
-                                       if (game.state.baseqx[ll]==quadx && game.state.baseqy[ll]==quady) {
-                                               game.state.baseqx[ll]=game.state.baseqx[game.state.rembase];
-                                               game.state.baseqy[ll]=game.state.baseqy[game.state.rembase];
-                                               break;
-                                       }
-                               }
-                               game.quad[ix][iy]=IHDOT;
-                               game.state.rembase--;
-                               basex=basey=0;
-                               game.state.galaxy[quadx][quady] -= BASE_PLACE;
-                               game.state.basekl++;
-                               newcnd();
-                               return;
-                       case IHP: /* Hit a planet */
-                               crmena(1, iquad, 2, ix, iy);
-                               prout(" destroyed.");
-                               game.state.nplankl++;
-                               game.state.newstuf[quadx][quady] -= 1;
-                               DESTROY(&game.state.plnets[iplnet]);
-                               iplnet = 0;
-                               plnetx = plnety = 0;
-                               game.quad[ix][iy] = IHDOT;
-                               if (landed==1) {
-                                       /* captain perishes on planet */
-                                       finish(FDPLANET);
-                               }
-                               return;
-                       case IHSTAR: /* Hit a star */
-                               if (Rand() > 0.10) {
-                                       nova(ix, iy);
-                                       return;
-                               }
-                               crmena(1, IHSTAR, 2, ix, iy);
-                               prout(" unaffected by photon blast.");
-                               return;
-                       case IHQUEST: /* Hit a thingy */
-                            if (Rand()>0.7) {  // Used to be certain death 
-                               skip(1);
-                               prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!");
-                               skip(1);
-                               prouts("    HACK!     HACK!    HACK!        *CHOKE!*  ");
-                               skip(1);
-                               proutn("Mr. Spock-");
-                               prouts("  \"Fascinating!\"");
-                               skip(1);
-                                deadkl(ix, iy, iquad, ix, iy);
-                            } else {
-                               /*
-                                * Stas Sergeev added the possibility that
-                                * you can shove the Thingy.
-                                */
-                                iqengry=1;
-                                shoved=1;
-                            }
-                           return;
-                       case IHBLANK: /* Black hole */
-                               skip(1);
-                               crmena(1, IHBLANK, 2, ix, iy);
-                               prout(" swallows torpedo.");
-                               return;
-                       case IHWEB: /* hit the web */
-                               skip(1);
-                               prout("***Torpedo absorbed by Tholian web.");
-                               return;
-                       case IHT:  /* Hit a Tholian */
-                               h1 = 700.0 + 100.0*Rand() -
-                                        1000.0*sqrt(square(ix-inx)+square(iy-iny))*
-                                        fabs(sin(bullseye-angle));
-                               h1 = fabs(h1);
-                               if (h1 >= 600) {
-                                       game.quad[ix][iy] = IHDOT;
-                                       ithere = 0;
-                                       ithx = ithy = 0;
-                                        deadkl(ix, iy, iquad, ix, iy);
-                                       return;
-                               }
-                               skip(1);
-                               crmena(1, IHT, 2, ix, iy);
-                               if (Rand() > 0.05) {
-                                       prout(" survives photon blast.");
-                                       return;
-                               }
-                               prout(" disappears.");
-                               game.quad[ix][iy] = IHWEB;
-                               ithere = ithx = ithy = 0;
-                               nenhere--;
-                               {
-                                       int dum, my;
-                                       dropin(IHBLANK, &dum, &my);
-                               }
-                               return;
-                                       
-                       default: /* Problem! */
-                               skip(1);
-                               proutn("Don't know how to handle collision with ");
-                               crmena(1, iquad, 2, ix, iy);
-                               skip(1);
-                               return;
+       case IHC: /* Hit a commander */
+       case IHS:
+           if (Rand() <= 0.05) {
+               crmena(1, iquad, 2, ix, iy);
+               prout(" uses anti-photon device;");
+               prout("   torpedo neutralized.");
+               return;
+           }
+       case IHR: /* Hit a regular enemy */
+       case IHK:
+           /* find the enemy */
+           for (ll=1; ll <= nenhere; ll++)
+               if (ix==game.kx[ll] && iy==game.ky[ll]) break;
+           kp = fabs(game.kpower[ll]);
+           h1 = 700.0 + 100.0*Rand() -
+               1000.0*sqrt(square(ix-inx)+square(iy-iny))*
+               fabs(sin(bullseye-angle));
+           h1 = fabs(h1);
+           if (kp < h1) h1 = kp;
+           game.kpower[ll] -= (game.kpower[ll]<0 ? -h1 : h1);
+           if (game.kpower[ll] == 0) {
+               deadkl(ix, iy, iquad, ix, iy);
+               return;
+           }
+           crmena(1, iquad, 2, ix, iy);
+           /* If enemy damaged but not destroyed, try to displace */
+           ang = angle + 2.5*(Rand()-0.5);
+           temp = fabs(sin(ang));
+           if (fabs(cos(ang)) > temp) temp = fabs(cos(ang));
+           xx = -sin(ang)/temp;
+           yy = cos(ang)/temp;
+           jx=ix+xx+0.5;
+           jy=iy+yy+0.5;
+           if (jx<1 || jx>QUADSIZE || jy<1 ||jy > QUADSIZE) {
+               prout(" damaged but not destroyed.");
+               return;
+           }
+           if (game.quad[jx][jy]==IHBLANK) {
+               prout(" buffeted into black hole.");
+               deadkl(ix, iy, iquad, jx, jy);
+               return;
+           }
+           if (game.quad[jx][jy]!=IHDOT) {
+               /* can't move into object */
+               prout(" damaged but not destroyed.");
+               return;
+           }
+           proutn(" damaged--");
+           game.kx[ll] = jx;
+           game.ky[ll] = jy;
+           shoved = 1;
+           break;
+       case IHB: /* Hit a base */
+           skip(1);
+           prout("***STARBASE DESTROYED..");
+           if (game.starch[quadx][quady] < 0) game.starch[quadx][quady] = 0;
+           for (ll=1; ll<=game.state.rembase; ll++) {
+               if (game.state.baseqx[ll]==quadx && game.state.baseqy[ll]==quady) {
+                   game.state.baseqx[ll]=game.state.baseqx[game.state.rembase];
+                   game.state.baseqy[ll]=game.state.baseqy[game.state.rembase];
+                   break;
                }
-               break;
-       }
-        if(curwnd!=message_window) {
-           setwnd(message_window);
-       }
-       if (shoved) {
-               game.quad[jx][jy]=iquad;
-               game.quad[ix][iy]=IHDOT;
-               prout(" displaced by blast to %s ", cramlc(sector, jx, jy));
-               for (ll=1; ll<=nenhere; ll++)
-                       game.kdist[ll] = game.kavgd[ll] = sqrt(square(sectx-game.kx[ll])+square(secty-game.ky[ll]));
-               sortkl();
+           }
+           game.quad[ix][iy]=IHDOT;
+           game.state.rembase--;
+           basex=basey=0;
+           game.state.galaxy[quadx][quady] -= BASE_PLACE;
+           game.state.basekl++;
+           newcnd();
+           return;
+       case IHP: /* Hit a planet */
+           crmena(1, iquad, 2, ix, iy);
+           prout(" destroyed.");
+           game.state.nplankl++;
+           game.state.newstuf[quadx][quady] -= 1;
+           DESTROY(&game.state.plnets[iplnet]);
+           iplnet = 0;
+           plnetx = plnety = 0;
+           game.quad[ix][iy] = IHDOT;
+           if (landed==1) {
+               /* captain perishes on planet */
+               finish(FDPLANET);
+           }
+           return;
+       case IHSTAR: /* Hit a star */
+           if (Rand() > 0.10) {
+               nova(ix, iy);
                return;
+           }
+           crmena(1, IHSTAR, 2, ix, iy);
+           prout(" unaffected by photon blast.");
+           return;
+       case IHQUEST: /* Hit a thingy */
+           if (Rand()>0.7) {   // Used to be certain death 
+               skip(1);
+               prouts("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!");
+               skip(1);
+               prouts("    HACK!     HACK!    HACK!        *CHOKE!*  ");
+               skip(1);
+               proutn("Mr. Spock-");
+               prouts("  \"Fascinating!\"");
+               skip(1);
+               deadkl(ix, iy, iquad, ix, iy);
+           } else {
+               /*
+                * Stas Sergeev added the possibility that
+                * you can shove the Thingy.
+                */
+               iqengry=1;
+               shoved=1;
+           }
+           return;
+       case IHBLANK: /* Black hole */
+           skip(1);
+           crmena(1, IHBLANK, 2, ix, iy);
+           prout(" swallows torpedo.");
+           return;
+       case IHWEB: /* hit the web */
+           skip(1);
+           prout("***Torpedo absorbed by Tholian web.");
+           return;
+       case IHT:  /* Hit a Tholian */
+           h1 = 700.0 + 100.0*Rand() -
+               1000.0*sqrt(square(ix-inx)+square(iy-iny))*
+               fabs(sin(bullseye-angle));
+           h1 = fabs(h1);
+           if (h1 >= 600) {
+               game.quad[ix][iy] = IHDOT;
+               ithere = 0;
+               ithx = ithy = 0;
+               deadkl(ix, iy, iquad, ix, iy);
+               return;
+           }
+           skip(1);
+           crmena(1, IHT, 2, ix, iy);
+           if (Rand() > 0.05) {
+               prout(" survives photon blast.");
+               return;
+           }
+           prout(" disappears.");
+           game.quad[ix][iy] = IHWEB;
+           ithere = ithx = ithy = 0;
+           nenhere--;
+           {
+               int dum, my;
+               dropin(IHBLANK, &dum, &my);
+           }
+           return;
+                                       
+       default: /* Problem! */
+           skip(1);
+           proutn("Don't know how to handle collision with ");
+           crmena(1, iquad, 2, ix, iy);
+           skip(1);
+           return;
        }
-       skip(1);
-       prout("Torpedo missed.");
+       break;
+    }
+    if(curwnd!=message_window) {
+       setwnd(message_window);
+    }
+    if (shoved) {
+       game.quad[jx][jy]=iquad;
+       game.quad[ix][iy]=IHDOT;
+       prout(" displaced by blast to %s ", cramlc(sector, jx, jy));
+       for (ll=1; ll<=nenhere; ll++)
+           game.kdist[ll] = game.kavgd[ll] = sqrt(square(sectx-game.kx[ll])+square(secty-game.ky[ll]));
+       sortkl();
        return;
+    }
+    skip(1);
+    prout("Torpedo missed.");
+    return;
 }
 
-static void fry(double hit) {
-       double ncrit, extradm;
-       int ktr=1, l, ll, j, cdam[NDEVICES+1];
+static void fry(double hit) 
+{
+    double ncrit, extradm;
+    int ktr=1, l, ll, j, cdam[NDEVICES+1];
 
-       /* a critical hit occured */
-       if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return;
+    /* a critical hit occured */
+    if (hit < (275.0-25.0*skill)*(1.0+0.5*Rand())) return;
 
-       ncrit = 1.0 + hit/(500.0+100.0*Rand());
-       proutn("***CRITICAL HIT--");
-       /* Select devices and cause damage */
-       for (l = 1; l <= ncrit && l <= NDEVICES; l++) {
-               do {
-                       j = NDEVICES*Rand()+1.0;
-                       /* Cheat to prevent shuttle damage unless on ship */
-               } while (game.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||
-                                j == DDRAY);
-               cdam[l] = j;
-               extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand()));
-               game.damage[j] += extradm;
-               if (l > 1) {
-                       for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ;
-                       if (ll<=l) continue;
-                       ktr += 1;
-                       if (ktr==3) skip(1);
-                       proutn(" and ");
-               }
-               proutn(device[j]);
-       }
-       prout(" damaged.");
-       if (game.damage[DSHIELD] && shldup) {
-               prout("***Shields knocked down.");
-               shldup=0;
+    ncrit = 1.0 + hit/(500.0+100.0*Rand());
+    proutn("***CRITICAL HIT--");
+    /* Select devices and cause damage */
+    for (l = 1; l <= ncrit && l <= NDEVICES; l++) {
+       do {
+           j = NDEVICES*Rand()+1.0;
+           /* Cheat to prevent shuttle damage unless on ship */
+       } while (game.damage[j] < 0.0 || (j == DSHUTTL && iscraft != 1) ||
+                j == DDRAY);
+       cdam[l] = j;
+       extradm = (hit*damfac)/(ncrit*(75.0+25.0*Rand()));
+       game.damage[j] += extradm;
+       if (l > 1) {
+           for (ll=2; ll<=l && j != cdam[ll-1]; ll++) ;
+           if (ll<=l) continue;
+           ktr += 1;
+           if (ktr==3) skip(1);
+           proutn(" and ");
        }
+       proutn(device[j]);
+    }
+    prout(" damaged.");
+    if (game.damage[DSHIELD] && shldup) {
+       prout("***Shields knocked down.");
+       shldup=0;
+    }
 }
 
-void attack(int k) {
-       /* k == 0 forces use of phasers in an attack */
-       int percent, ihurt=0, l, i=0, jx, jy, iquad, itflag;
-       int atackd = 0, attempt = 0;
-       double hit;
-       double pfac, dustfac, hitmax=0.0, hittot=0.0, chgfac=1.0, r;
+void attack(int torps_ok) 
+{
+    /* torps_ok == 0 forces use of phasers in an attack */
+    int percent, ihurt=0, l, i=0, jx, jy, iquad, itflag;
+    int atackd = 0, attempt = 0;
+    double hit;
+    double pfac, dustfac, hitmax=0.0, hittot=0.0, chgfac=1.0, r;
 
-       iattak = 1;
-       if (alldone) return;
+    iattak = 1;
+    if (alldone) return;
 #ifdef DEBUG
-       if (idebug) prout("ATTACK!");
+    if (idebug) prout("ATTACK!");
 #endif
 
-       if (ithere) movetho();
+    if (ithere) movetho();
 
-       if (neutz) { /* The one chance not to be attacked */
-               neutz = 0;
-               return;
-       }
-       if ((((comhere || ishere) && (justin == 0)) || skill == 5)&&(k!=0)) movcom();
-       if (nenhere==0 || (nenhere==1 && iqhere && iqengry==0)) return;
-       pfac = 1.0/inshld;
-       if (shldchg == 1) chgfac = 0.25+0.5*Rand();
-       skip(1);
-       if (skill <= 2) i = 2;
-       for (l=1; l <= nenhere; l++) {
-               if (game.kpower[l] < 0) continue;       /* too weak to attack */
-               /* compute hit strength and diminsh shield power */
-               r = Rand();
-               /* Increase chance of photon torpedos if docked or enemy energy low */
-               if (condit == IHDOCKED) r *= 0.25;
-               if (game.kpower[l] < 500) r *= 0.25; 
-               jx = game.kx[l];
-               jy = game.ky[l];
-               iquad = game.quad[jx][jy];
-                if (iquad==IHT || (iquad==IHQUEST && !iqengry)) continue;
-               itflag = (iquad == IHK && r > 0.0005) || k == 0 ||
-                       (iquad==IHC && r > 0.015) ||
-                       (iquad==IHR && r > 0.3) ||
-                        (iquad==IHS && r > 0.07) ||
-                        (iquad==IHQUEST && r > 0.05);
-               if (itflag) {
-                       /* Enemy uses phasers */
-                       if (condit == IHDOCKED) continue; /* Don't waste the effort! */
-                       attempt = 1; /* Attempt to attack */
-                       dustfac = 0.8+0.05*Rand();
-                       hit = game.kpower[l]*pow(dustfac,game.kavgd[l]);
-                       game.kpower[l] *= 0.75;
-               }
-               else { /* Enemy used photon torpedo */
-                       double course = 1.90985*atan2((double)secty-jy, (double)jx-sectx);
-                       hit = 0;
-                       proutn("***TORPEDO INCOMING");
-                       if (game.damage[DSRSENS] <= 0.0) {
-                               proutn(" From ");
-                               crmena(0, iquad, i, jx, jy);
-                       }
-                       attempt = 1;
-                       prout("  ");
-                       r = (Rand()+Rand())*0.5 -0.5;
-                       r += 0.002*game.kpower[l]*r;
-                       torpedo(course, r, jx, jy, &hit, 0, 1, 1);
-                       if (game.state.remkl==0) finish(FWON); /* Klingons did themselves in! */
-                       if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE ||
-                               alldone) return; /* Supernova or finished */
-                       if (hit == 0) continue;
-               }
-                if (shldup != 0 || shldchg != 0 || condit==IHDOCKED) {
-                       /* shields will take hits */
-                        double absorb, hitsh, propor = pfac*shield*(condit==IHDOCKED ? 2.1 : 1.0);
-                       if(propor < 0.1) propor = 0.1;
-                       hitsh = propor*chgfac*hit+1.0;
-                       atackd=1;
-                       absorb = 0.8*hitsh;
-                       if (absorb > shield) absorb = shield;
-                       shield -= absorb;
-                       hit -= hitsh;
-                        if (condit==IHDOCKED) dock(0);
-                       if (propor > 0.1 && hit < 0.005*energy) continue;
-               }
-               /* It's a hit -- print out hit size */
-               atackd = 1; /* We weren't going to check casualties, etc. if
-                              shields were down for some strange reason. This
-                                          doesn't make any sense, so I've fixed it */
-               ihurt = 1;
-               proutn("%d unit hit", (int)hit);
-               if ((game.damage[DSRSENS] > 0 && itflag) || skill <= 2) {
-                       proutn(" on the ");
-                       crmshp();
-               }
-               if (game.damage[DSRSENS] <= 0.0 && itflag) {
-                       proutn(" from ");
-                       crmena(0, iquad, i, jx, jy);
-               }
-               skip(1);
-               /* Decide if hit is critical */
-               if (hit > hitmax) hitmax = hit;
-               hittot += hit;
-               fry(hit);
-               prout("Hit %g energy %g", hit, energy);
-               energy -= hit;
-                if (condit==IHDOCKED) dock(0);
+    if (neutz) { /* The one chance not to be attacked */
+       neutz = 0;
+       return;
+    }
+    if ((((comhere || ishere) && (justin == 0)) || skill == SKILL_EMERITUS)&&(torps_ok!=0)) movcom();
+    if (nenhere==0 || (nenhere==1 && iqhere && iqengry==0)) return;
+    pfac = 1.0/inshld;
+    if (shldchg == 1) chgfac = 0.25+0.5*Rand();
+    skip(1);
+    if (skill <= SKILL_FAIR) i = 2;
+    for (l=1; l <= nenhere; l++) {
+       if (game.kpower[l] < 0) continue;       /* too weak to attack */
+       /* compute hit strength and diminsh shield power */
+       r = Rand();
+       /* Increase chance of photon torpedos if docked or enemy energy low */
+       if (condit == IHDOCKED) r *= 0.25;
+       if (game.kpower[l] < 500) r *= 0.25; 
+       jx = game.kx[l];
+       jy = game.ky[l];
+       iquad = game.quad[jx][jy];
+       if (iquad==IHT || (iquad==IHQUEST && !iqengry)) continue;
+       itflag = (iquad == IHK && r > 0.0005) || !torps_ok ||
+           (iquad==IHC && r > 0.015) ||
+           (iquad==IHR && r > 0.3) ||
+           (iquad==IHS && r > 0.07) ||
+           (iquad==IHQUEST && r > 0.05);
+       if (itflag) {
+           /* Enemy uses phasers */
+           if (condit == IHDOCKED) continue; /* Don't waste the effort! */
+           attempt = 1; /* Attempt to attack */
+           dustfac = 0.8+0.05*Rand();
+           hit = game.kpower[l]*pow(dustfac,game.kavgd[l]);
+           game.kpower[l] *= 0.75;
        }
-       if (energy <= 0) {
-               /* Returning home upon your shield, not with it... */
-               finish(FBATTLE);
-               return;
+       else { /* Enemy used photon torpedo */
+           double course = 1.90985*atan2((double)secty-jy, (double)jx-sectx);
+           hit = 0;
+           proutn("***TORPEDO INCOMING");
+           if (game.damage[DSRSENS] <= 0.0) {
+               proutn(" From ");
+               crmena(0, iquad, i, jx, jy);
+           }
+           attempt = 1;
+           prout("  ");
+           r = (Rand()+Rand())*0.5 -0.5;
+           r += 0.002*game.kpower[l]*r;
+           torpedo(course, r, jx, jy, &hit, 0, 1, 1);
+           if (game.state.remkl==0) finish(FWON); /* Klingons did themselves in! */
+           if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE ||
+               alldone) return; /* Supernova or finished */
+           if (hit == 0) continue;
        }
-       if (attempt == 0 && condit == IHDOCKED)
-               prout("***Enemies decide against attacking your ship.");
-       if (atackd == 0) return;
-       percent = 100.0*pfac*shield+0.5;
-       if (ihurt==0) {
-               /* Shields fully protect ship */
-               proutn("Enemy attack reduces shield strength to ");
+       if (shldup != 0 || shldchg != 0 || condit==IHDOCKED) {
+           /* shields will take hits */
+           double absorb, hitsh, propor = pfac*shield*(condit==IHDOCKED ? 2.1 : 1.0);
+           if(propor < 0.1) propor = 0.1;
+           hitsh = propor*chgfac*hit+1.0;
+           atackd=1;
+           absorb = 0.8*hitsh;
+           if (absorb > shield) absorb = shield;
+           shield -= absorb;
+           hit -= hitsh;
+           if (condit==IHDOCKED) dock(0);
+           if (propor > 0.1 && hit < 0.005*energy) continue;
        }
-       else {
-               /* Print message if starship suffered hit(s) */
-               skip(1);
-               proutn("Energy left %2d    shields ", (int)energy);
-               if (shldup) proutn("up ");
-               else if (game.damage[DSHIELD] == 0) proutn("down ");
-               else proutn("damaged, ");
+       /* It's a hit -- print out hit size */
+       atackd = 1; /* We weren't going to check casualties, etc. if
+                      shields were down for some strange reason. This
+                      doesn't make any sense, so I've fixed it */
+       ihurt = 1;
+       proutn("%d unit hit", (int)hit);
+       if ((game.damage[DSRSENS] > 0 && itflag) || skill<=SKILL_FAIR) {
+           proutn(" on the ");
+           crmshp();
        }
-       prout("%d%%,   torpedoes left %d", percent, torps);
-       /* Check if anyone was hurt */
-       if (hitmax >= 200 || hittot >= 500) {
-               int icas= hittot*Rand()*0.015;
-               if (icas >= 2) {
-                       skip(1);
-                       prout("Mc Coy-  \"Sickbay to bridge.  We suffered %d casualties", icas);
-                       prout("   in that last attack.\"");
-                       casual += icas;
-               }
+       if (game.damage[DSRSENS] <= 0.0 && itflag) {
+           proutn(" from ");
+           crmena(0, iquad, i, jx, jy);
        }
-       /* After attack, reset average distance to enemies */
-       for (l = 1; l <= nenhere; l++)
-               game.kavgd[l] = game.kdist[l];
-       sortkl();
+       skip(1);
+       /* Decide if hit is critical */
+       if (hit > hitmax) hitmax = hit;
+       hittot += hit;
+       fry(hit);
+       prout("Hit %g energy %g", hit, energy);
+       energy -= hit;
+       if (condit==IHDOCKED) 
+           dock(0);
+    }
+    if (energy <= 0) {
+       /* Returning home upon your shield, not with it... */
+       finish(FBATTLE);
        return;
+    }
+    if (attempt == 0 && condit == IHDOCKED)
+       prout("***Enemies decide against attacking your ship.");
+    if (atackd == 0) return;
+    percent = 100.0*pfac*shield+0.5;
+    if (ihurt==0) {
+       /* Shields fully protect ship */
+       proutn("Enemy attack reduces shield strength to ");
+    }
+    else {
+       /* Print message if starship suffered hit(s) */
+       skip(1);
+       proutn("Energy left %2d    shields ", (int)energy);
+       if (shldup) proutn("up ");
+       else if (game.damage[DSHIELD] == 0) proutn("down ");
+       else proutn("damaged, ");
+    }
+    prout("%d%%,   torpedoes left %d", percent, torps);
+    /* Check if anyone was hurt */
+    if (hitmax >= 200 || hittot >= 500) {
+       int icas= hittot*Rand()*0.015;
+       if (icas >= 2) {
+           skip(1);
+           prout("Mc Coy-  \"Sickbay to bridge.  We suffered %d casualties", icas);
+           prout("   in that last attack.\"");
+           casual += icas;
+       }
+    }
+    /* After attack, reset average distance to enemies */
+    for (l = 1; l <= nenhere; l++)
+       game.kavgd[l] = game.kdist[l];
+    sortkl();
+    return;
 }
                
-void deadkl(int ix, int iy, int type, int ixx, int iyy) {
-       /* Added ixx and iyy allow enemy to "move" before dying */
+void deadkl(int ix, int iy, int type, int ixx, int iyy) 
+{
+    /* Added ixx and iyy allow enemy to "move" before dying */
 
-       int i,j;
+    int i,j;
 
-        skip(1);
-       crmena(1, type, 2, ixx, iyy);
-       /* Decide what kind of enemy it is and update approriately */
-       if (type == IHR) {
-               /* chalk up a Romulan */
-               game.state.newstuf[quadx][quady] -= ROMULAN_PLACE;
-               irhere--;
-               game.state.nromkl++;
-               game.state.nromrem--;
-       }
-       else if (type == IHT) {
-               /* Killed a Tholian */
-               ithere = 0;
-       }
-        else if (type == IHQUEST) {
-               /* Killed a Thingy */
-             iqhere=iqengry=thingx=thingy=0;
-        }
-       else {
-               /* Some type of a Klingon */
-               game.state.galaxy[quadx][quady] -= 100;
-               klhere--;
-               game.state.remkl--;
-               switch (type) {
-                       case IHC:
-                               comhere = 0;
-                               for (i=1; i<=game.state.remcom; i++)
-                                       if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;
-                               game.state.cx[i] = game.state.cx[game.state.remcom];
-                               game.state.cy[i] = game.state.cy[game.state.remcom];
-                               game.state.cx[game.state.remcom] = 0;
-                               game.state.cy[game.state.remcom] = 0;
-                               game.state.remcom--;
-                               game.future[FTBEAM] = 1e30;
-                               if (game.state.remcom != 0)
-                                       game.future[FTBEAM] = game.state.date + expran(1.0*incom/game.state.remcom);
-                               game.state.killc++;
-                               break;
-                       case IHK:
-                               game.state.killk++;
-                               break;
-                       case IHS:
-                               game.state.nscrem = ishere = game.state.isx = game.state.isy = isatb = iscate = 0;
-                               game.state.nsckill = 1;
-                               game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;
-                               break;
-               }
+    skip(1);
+    crmena(1, type, 2, ixx, iyy);
+    /* Decide what kind of enemy it is and update approriately */
+    if (type == IHR) {
+       /* chalk up a Romulan */
+       game.state.newstuf[quadx][quady] -= ROMULAN_PLACE;
+       irhere--;
+       game.state.nromkl++;
+       game.state.nromrem--;
+    }
+    else if (type == IHT) {
+       /* Killed a Tholian */
+       ithere = 0;
+    }
+    else if (type == IHQUEST) {
+       /* Killed a Thingy */
+       iqhere=iqengry=thingx=thingy=0;
+    }
+    else {
+       /* Some type of a Klingon */
+       game.state.galaxy[quadx][quady] -= KLINGON_PLACE;
+       klhere--;
+       game.state.remkl--;
+       switch (type) {
+       case IHC:
+           comhere = 0;
+           for (i=1; i<=game.state.remcom; i++)
+               if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;
+           game.state.cx[i] = game.state.cx[game.state.remcom];
+           game.state.cy[i] = game.state.cy[game.state.remcom];
+           game.state.cx[game.state.remcom] = 0;
+           game.state.cy[game.state.remcom] = 0;
+           game.state.remcom--;
+           game.future[FTBEAM] = 1e30;
+           if (game.state.remcom != 0)
+               game.future[FTBEAM] = game.state.date + expran(1.0*incom/game.state.remcom);
+           game.state.killc++;
+           break;
+       case IHK:
+           game.state.killk++;
+           break;
+       case IHS:
+           game.state.nscrem = ishere = game.state.isx = game.state.isy = isatb = iscate = 0;
+           game.state.nsckill = 1;
+           game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;
+           break;
        }
+    }
 
-       /* For each kind of enemy, finish message to player */
-       prout(" destroyed.");
-       game.quad[ix][iy] = IHDOT;
-       if (game.state.remkl==0) return;
+    /* For each kind of enemy, finish message to player */
+    prout(" destroyed.");
+    game.quad[ix][iy] = IHDOT;
+    if (game.state.remkl==0) return;
 
-       game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom);
+    game.state.remtime = game.state.remres/(game.state.remkl + 4*game.state.remcom);
 
-       /* Remove enemy ship from arrays describing local conditions */
-        if (game.future[FCDBAS] < 1e30 && batx==quadx && baty==quady && type==IHC)
-           game.future[FCDBAS] = 1e30;
-       for (i=1; i<=nenhere; i++)
-               if (game.kx[i]==ix && game.ky[i]==iy) break;
-       nenhere--;
-       if (i <= nenhere)  {
-               for (j=i; j<=nenhere; j++) {
-                       game.kx[j] = game.kx[j+1];
-                       game.ky[j] = game.ky[j+1];
-                       game.kpower[j] = game.kpower[j+1];
-                       game.kavgd[j] = game.kdist[j] = game.kdist[j+1];
-               }
+    /* Remove enemy ship from arrays describing local conditions */
+    if (game.future[FCDBAS] < 1e30 && batx==quadx && baty==quady && type==IHC)
+       game.future[FCDBAS] = 1e30;
+    for (i=1; i<=nenhere; i++)
+       if (game.kx[i]==ix && game.ky[i]==iy) break;
+    nenhere--;
+    if (i <= nenhere)  {
+       for (j=i; j<=nenhere; j++) {
+           game.kx[j] = game.kx[j+1];
+           game.ky[j] = game.ky[j+1];
+           game.kpower[j] = game.kpower[j+1];
+           game.kavgd[j] = game.kdist[j] = game.kdist[j+1];
        }
-       game.kx[nenhere+1] = 0;
-       game.ky[nenhere+1] = 0;
-       game.kdist[nenhere+1] = 0;
-       game.kavgd[nenhere+1] = 0;
-       game.kpower[nenhere+1] = 0;
-       return;
+    }
+    game.kx[nenhere+1] = 0;
+    game.ky[nenhere+1] = 0;
+    game.kdist[nenhere+1] = 0;
+    game.kavgd[nenhere+1] = 0;
+    game.kpower[nenhere+1] = 0;
+    return;
 }
 
-static int targetcheck(double x, double y, double *course) {
-       double deltx, delty;
-       /* Return TRUE if target is invalid */
-       if (x < 1.0 || x > QUADSIZE || y < 1.0 || y > QUADSIZE) {
-               huh();
-               return 1;
-       }
-       deltx = 0.1*(y - secty);
-       delty = 0.1*(sectx - x);
-       if (deltx==0 && delty== 0) {
-               skip(1);
-               prout("Spock-  \"Bridge to sickbay.  Dr. McCoy,");
-               prout("  I recommend an immediate review of");
-               prout("  the Captain's psychological profile.\"");
-               chew();
-               return 1;
-       }
-       *course = 1.90985932*atan2(deltx, delty);
-       return 0;
+static int targetcheck(double x, double y, double *course) 
+{
+    double deltx, delty;
+    /* Return TRUE if target is invalid */
+    if (x < 1.0 || x > QUADSIZE || y < 1.0 || y > QUADSIZE) {
+       huh();
+       return 1;
+    }
+    deltx = 0.1*(y - secty);
+    delty = 0.1*(sectx - x);
+    if (deltx==0 && delty== 0) {
+       skip(1);
+       prout("Spock-  \"Bridge to sickbay.  Dr. McCoy,");
+       prout("  I recommend an immediate review of");
+       prout("  the Captain's psychological profile.\"");
+       chew();
+       return 1;
+    }
+    *course = 1.90985932*atan2(deltx, delty);
+    return 0;
 }
 
-void photon(void) {
-       double targ[4][3], course[4];
-       double r, dummy;
-       int key, n, i, osuabor;
+void photon(void) 
+{
+    double targ[4][3], course[4];
+    double r, dummy;
+    int key, n, i, osuabor;
 
-       ididit = 0;
+    ididit = 0;
 
-       if (game.damage[DPHOTON]) {
-               prout("Photon tubes damaged.");
+    if (game.damage[DPHOTON]) {
+       prout("Photon tubes damaged.");
+       chew();
+       return;
+    }
+    if (torps == 0) {
+       prout("No torpedoes left.");
+       chew();
+       return;
+    }
+    key = scan();
+    for (;;) {
+       if (key == IHALPHA) {
+           huh();
+           return;
+       }
+       else if (key == IHEOL) {
+           prout("%d torpedoes left.", torps);
+           proutn("Number of torpedoes to fire- ");
+           key = scan();
+       }
+       else /* key == IHREAL */ {
+           n = aaitem + 0.5;
+           if (n <= 0) { /* abort command */
                chew();
                return;
-       }
-       if (torps == 0) {
-               prout("No torpedoes left.");
+           }
+           if (n > 3) {
                chew();
+               prout("Maximum of 3 torpedoes per burst.");
+               key = IHEOL;
                return;
+           }
+           if (n <= torps) break;
+           chew();
+           key = IHEOL;
        }
+    }
+    for (i = 1; i <= n; i++) {
        key = scan();
-       for (;;) {
-               if (key == IHALPHA) {
-                       huh();
-                       return;
-               }
-               else if (key == IHEOL) {
-                       prout("%d torpedoes left.", torps);
-                       proutn("Number of torpedoes to fire- ");
-                       key = scan();
-               }
-               else /* key == IHREAL */ {
-                       n = aaitem + 0.5;
-                       if (n <= 0) { /* abort command */
-                               chew();
-                               return;
-                       }
-                       if (n > 3) {
-                               chew();
-                               prout("Maximum of 3 torpedoes per burst.");
-                               key = IHEOL;
-                                return;
-                       }
-                       if (n <= torps) break;
-                       chew();
-                       key = IHEOL;
-               }
+       if (i==1 && key == IHEOL) {
+           break;      /* we will try prompting */
        }
-       for (i = 1; i <= n; i++) {
-               key = scan();
-               if (i==1 && key == IHEOL) {
-                       break;  /* we will try prompting */
-               }
-               if (i==2 && key == IHEOL) {
-                       /* direct all torpedoes at one target */
-                       while (i <= n) {
-                               targ[i][1] = targ[1][1];
-                               targ[i][2] = targ[1][2];
-                               course[i] = course[1];
-                               i++;
-                       }
-                       break;
-               }
-               if (key != IHREAL) {
-                       huh();
-                       return;
-               }
-               targ[i][1] = aaitem;
-               key = scan();
-               if (key != IHREAL) {
-                       huh();
-                       return;
-               }
-               targ[i][2] = aaitem;
-               if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
+       if (i==2 && key == IHEOL) {
+           /* direct all torpedoes at one target */
+           while (i <= n) {
+               targ[i][1] = targ[1][1];
+               targ[i][2] = targ[1][2];
+               course[i] = course[1];
+               i++;
+           }
+           break;
        }
-       chew();
-       if (i == 1 && key == IHEOL) {
-               /* prompt for each one */
-               for (i = 1; i <= n; i++) {
-                   proutn("Target sector for torpedo number %d- ", i);
-                       key = scan();
-                       if (key != IHREAL) {
-                               huh();
-                               return;
-                       }
-                       targ[i][1] = aaitem;
-                       key = scan();
-                       if (key != IHREAL) {
-                               huh();
-                               return;
-                       }
-                       targ[i][2] = aaitem;
-                       chew();
-                       if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
-               }
+       if (key != IHREAL) {
+           huh();
+           return;
        }
-       ididit = 1;
-       /* Loop for moving <n> torpedoes */
-       osuabor = 0;
-       for (i = 1; i <= n && !osuabor; i++) {
-               if (condit != IHDOCKED) torps--;
-               r = (Rand()+Rand())*0.5 -0.5;
-               if (fabs(r) >= 0.47) {
-                       /* misfire! */
-                       r = (Rand()+1.2) * r;
-                       if (n>1) {
-                           prouts("***TORPEDO NUMBER %d MISFIRES", i);
-                       }
-                       else prouts("***TORPEDO MISFIRES.");
-                       skip(1);
-                       if (i < n)
-                               prout("  Remainder of burst aborted.");
-                       osuabor=1;
-                       if (Rand() <= 0.2) {
-                               prout("***Photon tubes damaged by misfire.");
-                               game.damage[DPHOTON] = damfac*(1.0+2.0*Rand());
-                               break;
-                       }
-               }
-               if (shldup || condit == IHDOCKED) r *= 1.0 + 0.0001*shield;
-               torpedo(course[i], r, sectx, secty, &dummy, 0, i, n);
-               if (alldone || game.state.galaxy[quadx][quady]==1000) return;
+       targ[i][1] = aaitem;
+       key = scan();
+       if (key != IHREAL) {
+           huh();
+           return;
+       }
+       targ[i][2] = aaitem;
+       if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
+    }
+    chew();
+    if (i == 1 && key == IHEOL) {
+       /* prompt for each one */
+       for (i = 1; i <= n; i++) {
+           proutn("Target sector for torpedo number %d- ", i);
+           key = scan();
+           if (key != IHREAL) {
+               huh();
+               return;
+           }
+           targ[i][1] = aaitem;
+           key = scan();
+           if (key != IHREAL) {
+               huh();
+               return;
+           }
+           targ[i][2] = aaitem;
+           chew();
+           if (targetcheck(targ[i][1], targ[i][2], &course[i])) return;
        }
-       if (game.state.remkl==0) finish(FWON);
+    }
+    ididit = 1;
+    /* Loop for moving <n> torpedoes */
+    osuabor = 0;
+    for (i = 1; i <= n && !osuabor; i++) {
+       if (condit != IHDOCKED) torps--;
+       r = (Rand()+Rand())*0.5 -0.5;
+       if (fabs(r) >= 0.47) {
+           /* misfire! */
+           r = (Rand()+1.2) * r;
+           if (n>1) {
+               prouts("***TORPEDO NUMBER %d MISFIRES", i);
+           }
+           else prouts("***TORPEDO MISFIRES.");
+           skip(1);
+           if (i < n)
+               prout("  Remainder of burst aborted.");
+           osuabor=1;
+           if (Rand() <= 0.2) {
+               prout("***Photon tubes damaged by misfire.");
+               game.damage[DPHOTON] = damfac*(1.0+2.0*Rand());
+               break;
+           }
+       }
+       if (shldup || condit == IHDOCKED) 
+           r *= 1.0 + 0.0001*shield;
+       torpedo(course[i], r, sectx, secty, &dummy, 0, i, n);
+       if (alldone||game.state.galaxy[quadx][quady]==SUPERNOVA_PLACE)
+           return;
+    }
+    if (game.state.remkl==0) finish(FWON);
 }
 
        
 
-static void overheat(double rpow) {
-       if (rpow > 1500) {
-               double chekbrn = (rpow-1500.)*0.00038;
-               if (Rand() <= chekbrn) {
-                       prout("Weapons officer Sulu-  \"Phasers overheated, sir.\"");
-                       game.damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);
-               }
+static void overheat(double rpow) 
+{
+    if (rpow > 1500) {
+       double chekbrn = (rpow-1500.)*0.00038;
+       if (Rand() <= chekbrn) {
+           prout("Weapons officer Sulu-  \"Phasers overheated, sir.\"");
+           game.damage[DPHASER] = damfac*(1.0 + Rand()) * (1.0+chekbrn);
        }
+    }
 }
 
-static int checkshctrl(double rpow) {
-       double hit;
-       int icas;
+static int checkshctrl(double rpow) 
+{
+    double hit;
+    int icas;
        
+    skip(1);
+    if (Rand() < .998) {
+       prout("Shields lowered.");
+       return 0;
+    }
+    /* Something bad has happened */
+    prouts("***RED ALERT!  RED ALERT!");
+    skip(2);
+    hit = rpow*shield/inshld;
+    energy -= rpow+hit*0.8;
+    shield -= hit*0.2;
+    if (energy <= 0.0) {
+       prouts("Sulu-  \"Captain! Shield malf***********************\"");
        skip(1);
-       if (Rand() < .998) {
-               prout("Shields lowered.");
-               return 0;
-       }
-       /* Something bad has happened */
-       prouts("***RED ALERT!  RED ALERT!");
-       skip(2);
-       hit = rpow*shield/inshld;
-       energy -= rpow+hit*0.8;
-       shield -= hit*0.2;
-       if (energy <= 0.0) {
-               prouts("Sulu-  \"Captain! Shield malf***********************\"");
-               skip(1);
-               stars();
-               finish(FPHASER);
-               return 1;
-       }
-       prouts("Sulu-  \"Captain! Shield malfunction! Phaser fire contained!\"");
-       skip(2);
-       prout("Lt. Uhura-  \"Sir, all decks reporting damage.\"");
-       icas = hit*Rand()*0.012;
-       skip(1);
-       fry(0.8*hit);
-       if (icas) {
-               skip(1);
-               prout("McCoy to bridge- \"Severe radiation burns, Jim.");
-               prout("  %d casualties so far.\"", icas);
-               casual -= icas;
-       }
-       skip(1);
-       prout("Phaser energy dispersed by shields.");
-       prout("Enemy unaffected.");
-       overheat(rpow);
+       stars();
+       finish(FPHASER);
        return 1;
+    }
+    prouts("Sulu-  \"Captain! Shield malfunction! Phaser fire contained!\"");
+    skip(2);
+    prout("Lt. Uhura-  \"Sir, all decks reporting damage.\"");
+    icas = hit*Rand()*0.012;
+    skip(1);
+    fry(0.8*hit);
+    if (icas) {
+       skip(1);
+       prout("McCoy to bridge- \"Severe radiation burns, Jim.");
+       prout("  %d casualties so far.\"", icas);
+       casual -= icas;
+    }
+    skip(1);
+    prout("Phaser energy dispersed by shields.");
+    prout("Enemy unaffected.");
+    overheat(rpow);
+    return 1;
 }
        
 
-void phasers(void) {
-       double hits[21], rpow=0, extra, powrem, over, temp;
-       int kz = 0, k=1, i, irec=0; /* Cheating inhibitor */
-       int ifast=0, no=0, ipoop=1, msgflag = 1;
-       enum {NOTSET, MANUAL, FORCEMAN, AUTOMATIC} automode = NOTSET;
-       int key=0;
+void phasers(void) 
+{
+    double hits[21], rpow=0, extra, powrem, over, temp;
+    int kz = 0, k=1, i, irec=0; /* Cheating inhibitor */
+    int ifast=0, no=0, ipoop=1, msgflag = 1;
+    enum {NOTSET, MANUAL, FORCEMAN, AUTOMATIC} automode = NOTSET;
+    int key=0;
 
-       skip(1);
-       /* SR sensors and Computer */
-       if (game.damage[DSRSENS]+game.damage[DCOMPTR] > 0) ipoop = 0;
-       if (condit == IHDOCKED) {
-               prout("Phasers can't be fired through base shields.");
-               chew();
-               return;
+    skip(1);
+    /* SR sensors and Computer */
+    if (game.damage[DSRSENS]+game.damage[DCOMPTR] > 0) ipoop = 0;
+    if (condit == IHDOCKED) {
+       prout("Phasers can't be fired through base shields.");
+       chew();
+       return;
+    }
+    if (game.damage[DPHASER] != 0) {
+       prout("Phaser control damaged.");
+       chew();
+       return;
+    }
+    if (shldup) {
+       if (game.damage[DSHCTRL]) {
+           prout("High speed shield control damaged.");
+           chew();
+           return;
        }
-       if (game.damage[DPHASER] != 0) {
-               prout("Phaser control damaged.");
-               chew();
-               return;
+       if (energy <= 200.0) {
+           prout("Insufficient energy to activate high-speed shield control.");
+           chew();
+           return;
        }
-       if (shldup) {
-               if (game.damage[DSHCTRL]) {
-                       prout("High speed shield control damaged.");
-                       chew();
-                       return;
-               }
-               if (energy <= 200.0) {
-                       prout("Insufficient energy to activate high-speed shield control.");
-                       chew();
-                       return;
-               }
-               prout("Weapons Officer Sulu-  \"High-speed shield control enabled, sir.\"");
-               ifast = 1;
+       prout("Weapons Officer Sulu-  \"High-speed shield control enabled, sir.\"");
+       ifast = 1;
                
-       }
-       /* Original code so convoluted, I re-did it all */
-       while (automode==NOTSET) {
-               key=scan();
-               if (key == IHALPHA) {
-                       if (isit("manual")) {
-                               if (nenhere==0) {
-                                       prout("There is no enemy present to select.");
-                                       chew();
-                                       key = IHEOL;
-                                       automode=AUTOMATIC;
-                               }
-                               else {
-                                       automode = MANUAL;
-                                       key = scan();
-                               }
-                       }
-                       else if (isit("automatic")) {
-                               if ((!ipoop) && nenhere != 0) {
-                                       automode = FORCEMAN;
-                               }
-                               else {
-                                       if (nenhere==0)
-                                               prout("Energy will be expended into space.");
-                                       automode = AUTOMATIC;
-                                       key = scan();
-                               }
-                       }
-                       else if (isit("no")) {
-                               no = 1;
-                       }
-                       else {
-                               huh();
-                               return;
-                       }
+    }
+    /* Original code so convoluted, I re-did it all */
+    while (automode==NOTSET) {
+       key=scan();
+       if (key == IHALPHA) {
+           if (isit("manual")) {
+               if (nenhere==0) {
+                   prout("There is no enemy present to select.");
+                   chew();
+                   key = IHEOL;
+                   automode=AUTOMATIC;
                }
-               else if (key == IHREAL) {
-                       if (nenhere==0) {
-                               prout("Energy will be expended into space.");
-                               automode = AUTOMATIC;
-                       }
-                       else if (!ipoop)
-                               automode = FORCEMAN;
-                       else
-                               automode = AUTOMATIC;
+               else {
+                   automode = MANUAL;
+                   key = scan();
+               }
+           }
+           else if (isit("automatic")) {
+               if ((!ipoop) && nenhere != 0) {
+                   automode = FORCEMAN;
                }
                else {
-                       /* IHEOL */
-                       if (nenhere==0) {
-                               prout("Energy will be expended into space.");
-                               automode = AUTOMATIC;
-                       }
-                       else if (!ipoop)
-                               automode = FORCEMAN;
-                       else 
-                       proutn("Manual or automatic? ");
+                   if (nenhere==0)
+                       prout("Energy will be expended into space.");
+                   automode = AUTOMATIC;
+                   key = scan();
                }
+           }
+           else if (isit("no")) {
+               no = 1;
+           }
+           else {
+               huh();
+               return;
+           }
        }
+       else if (key == IHREAL) {
+           if (nenhere==0) {
+               prout("Energy will be expended into space.");
+               automode = AUTOMATIC;
+           }
+           else if (!ipoop)
+               automode = FORCEMAN;
+           else
+               automode = AUTOMATIC;
+       }
+       else {
+           /* IHEOL */
+           if (nenhere==0) {
+               prout("Energy will be expended into space.");
+               automode = AUTOMATIC;
+           }
+           else if (!ipoop)
+               automode = FORCEMAN;
+           else 
+               proutn("Manual or automatic? ");
+       }
+    }
                                
-       switch (automode) {
-               case AUTOMATIC:
-                       if (key == IHALPHA && isit("no")) {
-                               no = 1;
-                               key = scan();
-                       }
-                       if (key != IHREAL && nenhere != 0) {
-                                prout("Phasers locked on target. Energy available: %.2f",
-                                   ifast?energy-200.0:energy,1,2);
-                       }
-                        irec=0;
-                       do {
-                                        chew();
-                                        if (!kz) for (i = 1; i <= nenhere; i++)
-                                                     irec+=fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]))*
-                                                     (1.01+0.05*Rand()) + 1.0;
-                                        kz=1;
-                                        proutn("(%d) units required. ", irec);
-                                       chew();
-                                       proutn("Units to fire= ");
-                                       key = scan();
-                                        if (key!=IHREAL) return;
-                                       rpow = aaitem;
-                                       if (rpow > (ifast?energy-200:energy)) {
-                                           proutn("Energy available= %.2f",
-                                           ifast?energy-200:energy);
-                                       skip(1);
-                                       key = IHEOL;
-                               }
-                       } while (rpow > (ifast?energy-200:energy));
-                       if (rpow<=0) {
-                               /* chicken out */
-                               chew();
-                               return;
-                       }
-                       if ((key=scan()) == IHALPHA && isit("no")) {
-                               no = 1;
-                       }
-                       if (ifast) {
-                               energy -= 200; /* Go and do it! */
-                               if (checkshctrl(rpow)) return;
-                       }
-                       chew();
-                       energy -= rpow;
-                       extra = rpow;
-                       if (nenhere) {
-                               extra = 0.0;
-                               powrem = rpow;
-                               for (i = 1; i <= nenhere; i++) {
-                                       hits[i] = 0.0;
-                                       if (powrem <= 0) continue;
-                                       hits[i] = fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]));
-                                       over = (0.01 + 0.05*Rand())*hits[i];
-                                       temp = powrem;
-                                       powrem -= hits[i] + over;
-                                       if (powrem <= 0 && temp < hits[i]) hits[i] = temp;
-                                       if (powrem <= 0) over = 0.0;
-                                       extra += over;
-                               }
-                               if (powrem > 0.0) extra += powrem;
-                               hittem(hits);
-                                ididit=1;
-                       }
-                       if (extra > 0 && alldone == 0) {
-                               if (ithere) {
-                                       proutn("*** Tholian web absorbs ");
-                                       if (nenhere>0) proutn("excess ");
-                                       prout("phaser energy.");
-                               }
-                               else {
-                                       prout("%d expended on empty space.", (int)extra);
-                               }
-                       }
-                       break;
-
-               case FORCEMAN:
-                       chew();
-                       key = IHEOL;
-                       if (game.damage[DCOMPTR]!=0)
-                               prout("Battle comuter damaged, manual file only.");
-                       else {
-                               skip(1);
-                               prouts("---WORKING---");
-                               skip(1);
-                               prout("Short-range-sensors-damaged");
-                               prout("Insufficient-data-for-automatic-phaser-fire");
-                               prout("Manual-fire-must-be-used");
-                               skip(1);
-                       }
-               case MANUAL:
-                       rpow = 0.0;
-                       for (k = 1; k <= nenhere;) {
-                               int ii = game.kx[k], jj = game.ky[k];
-                               int ienm = game.quad[ii][jj];
-                               if (msgflag) {
-                                       proutn("Energy available= %.2f",
-                                              energy-.006-(ifast?200:0));
-                                       skip(1);
-                                       msgflag = 0;
-                                       rpow = 0.0;
-                               }
-                               if (game.damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&
-                                       (ienm == IHC || ienm == IHS)) {
-                                       cramen(ienm);
-                                       prout(" can't be located without short range scan.");
-                                       chew();
-                                       key = IHEOL;
-                                       hits[k] = 0; /* prevent overflow -- thanks to Alexei Voitenko */
-                                       k++;
-                                       continue;
-                               }
-                               if (key == IHEOL) {
-                                       chew();
-                                        if (ipoop && k > kz)
-                                                irec=(fabs(game.kpower[k])/(PHASEFAC*pow(0.9,game.kdist[k])))*
-                                                                (1.01+0.05*Rand()) + 1.0;
-                                       kz = k;
-                                       proutn("(");
-                                        if (game.damage[DCOMPTR]==0) proutn("%d", irec);
-                                        else proutn("??");
-                                       proutn(")  ");
-                                       proutn("units to fire at ");
-                                       crmena(0, ienm, 2, ii, jj);
-                                       proutn("-  ");
-                                       key = scan();
-                               }
-                               if (key == IHALPHA && isit("no")) {
-                                       no = 1;
-                                       key = scan();
-                                       continue;
-                                       }
-                               if (key == IHALPHA) {
-                                       huh();
-                                       return;
-                               }
-                               if (key == IHEOL) {
-                                       if (k==1) { /* Let me say I'm baffled by this */
-                                               msgflag = 1;
-                                       }
-                                       continue;
-                               }
-                               if (aaitem < 0) {
-                                       /* abort out */
-                                       chew();
-                                       return;
-                               }
-                               hits[k] = aaitem;
-                               rpow += aaitem;
-                               /* If total requested is too much, inform and start over */
-                               
-                               if (rpow > (ifast?energy-200:energy)) {
-                                       prout("Available energy exceeded -- try again.");
-                                       chew();
-                                        return;
-                               }
-                               key = scan(); /* scan for next value */
-                               k++;
-                       }
-                       if (rpow == 0.0) {
-                               /* zero energy -- abort */
-                               chew();
-                               return;
-                       }
-                       if (key == IHALPHA && isit("no")) {
-                               no = 1;
-                       }
-                       energy -= rpow;
-                       chew();
-                       if (ifast) {
-                               energy -= 200.0;
-                               if (checkshctrl(rpow)) return;
-                       }
-                       hittem(hits);
-                       ididit=1;
-               case NOTSET:;   /* avoid gcc warning */
+    switch (automode) {
+    case AUTOMATIC:
+       if (key == IHALPHA && isit("no")) {
+           no = 1;
+           key = scan();
+       }
+       if (key != IHREAL && nenhere != 0) {
+           prout("Phasers locked on target. Energy available: %.2f",
+                 ifast?energy-200.0:energy,1,2);
+       }
+       irec=0;
+       do {
+           chew();
+           if (!kz) for (i = 1; i <= nenhere; i++)
+               irec+=fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]))*
+                   (1.01+0.05*Rand()) + 1.0;
+           kz=1;
+           proutn("(%d) units required. ", irec);
+           chew();
+           proutn("Units to fire= ");
+           key = scan();
+           if (key!=IHREAL) return;
+           rpow = aaitem;
+           if (rpow > (ifast?energy-200:energy)) {
+               proutn("Energy available= %.2f",
+                      ifast?energy-200:energy);
+               skip(1);
+               key = IHEOL;
+           }
+       } while (rpow > (ifast?energy-200:energy));
+       if (rpow<=0) {
+           /* chicken out */
+           chew();
+           return;
+       }
+       if ((key=scan()) == IHALPHA && isit("no")) {
+           no = 1;
        }
-       /* Say shield raised or malfunction, if necessary */
-       if (alldone) return;
        if (ifast) {
+           energy -= 200; /* Go and do it! */
+           if (checkshctrl(rpow)) return;
+       }
+       chew();
+       energy -= rpow;
+       extra = rpow;
+       if (nenhere) {
+           extra = 0.0;
+           powrem = rpow;
+           for (i = 1; i <= nenhere; i++) {
+               hits[i] = 0.0;
+               if (powrem <= 0) continue;
+               hits[i] = fabs(game.kpower[i])/(PHASEFAC*pow(0.90,game.kdist[i]));
+               over = (0.01 + 0.05*Rand())*hits[i];
+               temp = powrem;
+               powrem -= hits[i] + over;
+               if (powrem <= 0 && temp < hits[i]) hits[i] = temp;
+               if (powrem <= 0) over = 0.0;
+               extra += over;
+           }
+           if (powrem > 0.0) extra += powrem;
+           hittem(hits);
+           ididit=1;
+       }
+       if (extra > 0 && alldone == 0) {
+           if (ithere) {
+               proutn("*** Tholian web absorbs ");
+               if (nenhere>0) proutn("excess ");
+               prout("phaser energy.");
+           }
+           else {
+               prout("%d expended on empty space.", (int)extra);
+           }
+       }
+       break;
+
+    case FORCEMAN:
+       chew();
+       key = IHEOL;
+       if (game.damage[DCOMPTR]!=0)
+           prout("Battle comuter damaged, manual file only.");
+       else {
+           skip(1);
+           prouts("---WORKING---");
+           skip(1);
+           prout("Short-range-sensors-damaged");
+           prout("Insufficient-data-for-automatic-phaser-fire");
+           prout("Manual-fire-must-be-used");
+           skip(1);
+       }
+    case MANUAL:
+       rpow = 0.0;
+       for (k = 1; k <= nenhere;) {
+           int ii = game.kx[k], jj = game.ky[k];
+           int ienm = game.quad[ii][jj];
+           if (msgflag) {
+               proutn("Energy available= %.2f",
+                      energy-.006-(ifast?200:0));
                skip(1);
-               if (no == 0) {
-                       if (Rand() >= 0.99) {
-                               prout("Sulu-  \"Sir, the high-speed shield control has malfunctioned . . .");
-                               prouts("         CLICK   CLICK   POP  . . .");
-                               prout(" No  response, sir!");
-                               shldup = 0;
-                       }
-                       else
-                               prout("Shields raised.");
+               msgflag = 0;
+               rpow = 0.0;
+           }
+           if (game.damage[DSRSENS] && !(abs(sectx-ii) < 2 && abs(secty-jj) < 2) &&
+               (ienm == IHC || ienm == IHS)) {
+               cramen(ienm);
+               prout(" can't be located without short range scan.");
+               chew();
+               key = IHEOL;
+               hits[k] = 0; /* prevent overflow -- thanks to Alexei Voitenko */
+               k++;
+               continue;
+           }
+           if (key == IHEOL) {
+               chew();
+               if (ipoop && k > kz)
+                   irec=(fabs(game.kpower[k])/(PHASEFAC*pow(0.9,game.kdist[k])))*
+                       (1.01+0.05*Rand()) + 1.0;
+               kz = k;
+               proutn("(");
+               if (game.damage[DCOMPTR]==0) proutn("%d", irec);
+               else proutn("??");
+               proutn(")  ");
+               proutn("units to fire at ");
+               crmena(0, ienm, 2, ii, jj);
+               proutn("-  ");
+               key = scan();
+           }
+           if (key == IHALPHA && isit("no")) {
+               no = 1;
+               key = scan();
+               continue;
+           }
+           if (key == IHALPHA) {
+               huh();
+               return;
+           }
+           if (key == IHEOL) {
+               if (k==1) { /* Let me say I'm baffled by this */
+                   msgflag = 1;
                }
-               else
-                       shldup = 0;
+               continue;
+           }
+           if (aaitem < 0) {
+               /* abort out */
+               chew();
+               return;
+           }
+           hits[k] = aaitem;
+           rpow += aaitem;
+           /* If total requested is too much, inform and start over */
+                               
+           if (rpow > (ifast?energy-200:energy)) {
+               prout("Available energy exceeded -- try again.");
+               chew();
+               return;
+           }
+           key = scan(); /* scan for next value */
+           k++;
+       }
+       if (rpow == 0.0) {
+           /* zero energy -- abort */
+           chew();
+           return;
        }
-       overheat(rpow);
+       if (key == IHALPHA && isit("no")) {
+           no = 1;
+       }
+       energy -= rpow;
+       chew();
+       if (ifast) {
+           energy -= 200.0;
+           if (checkshctrl(rpow)) return;
+       }
+       hittem(hits);
+       ididit=1;
+    case NOTSET:;      /* avoid gcc warning */
+    }
+    /* Say shield raised or malfunction, if necessary */
+    if (alldone) 
+       return;
+    if (ifast) {
+       skip(1);
+       if (no == 0) {
+           if (Rand() >= 0.99) {
+               prout("Sulu-  \"Sir, the high-speed shield control has malfunctioned . . .");
+               prouts("         CLICK   CLICK   POP  . . .");
+               prout(" No  response, sir!");
+               shldup = 0;
+           }
+           else
+               prout("Shields raised.");
+       }
+       else
+           shldup = 0;
+    }
+    overheat(rpow);
 }
 
-void hittem(double *hits) {
-       double kp, kpow, wham, hit, dustfac, kpini;
-       int nenhr2=nenhere, k=1, kk=1, ii, jj, ienm;
+void hittem(double *hits) 
+{
+    double kp, kpow, wham, hit, dustfac, kpini;
+    int nenhr2=nenhere, k=1, kk=1, ii, jj, ienm;
 
-       skip(1);
+    skip(1);
 
-       for (; k <= nenhr2; k++, kk++) {
-               if ((wham = hits[k])==0) continue;
-               dustfac = 0.9 + 0.01*Rand();
-               hit = wham*pow(dustfac,game.kdist[kk]);
-               kpini = game.kpower[kk];
-               kp = fabs(kpini);
-               if (PHASEFAC*hit < kp) kp = PHASEFAC*hit;
-               game.kpower[kk] -= (game.kpower[kk] < 0 ? -kp: kp);
-               kpow = game.kpower[kk];
-               ii = game.kx[kk];
-               jj = game.ky[kk];
-               if (hit > 0.005) {
-                        if (game.damage[DSRSENS]==0)
-                           boom(ii, jj);
-                       proutn("%d unit hit on ", (int)hit);
-               }
-               else
-                       proutn("Very small hit on ");
-               ienm = game.quad[ii][jj];
-                if (ienm==IHQUEST) iqengry=1;
-               crmena(0,ienm,2,ii,jj);
-               skip(1);
-               if (kpow == 0) {
-                       deadkl(ii, jj, ienm, ii, jj);
-                       if (game.state.remkl==0) finish(FWON);
-                       if (alldone) return;
-                       kk--; /* don't do the increment */
-               }
-               else /* decide whether or not to emasculate klingon */
-                       if (kpow > 0 && Rand() >= 0.9 &&
-                               kpow <= ((0.4 + 0.4*Rand())*kpini)) {
-                               prout("***Mr. Spock-  \"Captain, the vessel at ",
-                                       cramlc(sector,ii,jj));
-                               prout("   has just lost its firepower.\"");
-                               game.kpower[kk] = -kpow;
-                       }
+    for (; k <= nenhr2; k++, kk++) {
+       if ((wham = hits[k])==0) continue;
+       dustfac = 0.9 + 0.01*Rand();
+       hit = wham*pow(dustfac,game.kdist[kk]);
+       kpini = game.kpower[kk];
+       kp = fabs(kpini);
+       if (PHASEFAC*hit < kp) kp = PHASEFAC*hit;
+       game.kpower[kk] -= (game.kpower[kk] < 0 ? -kp: kp);
+       kpow = game.kpower[kk];
+       ii = game.kx[kk];
+       jj = game.ky[kk];
+       if (hit > 0.005) {
+           if (game.damage[DSRSENS]==0)
+               boom(ii, jj);
+           proutn("%d unit hit on ", (int)hit);
        }
-       return;
+       else
+           proutn("Very small hit on ");
+       ienm = game.quad[ii][jj];
+       if (ienm==IHQUEST) iqengry=1;
+       crmena(0,ienm,2,ii,jj);
+       skip(1);
+       if (kpow == 0) {
+           deadkl(ii, jj, ienm, ii, jj);
+           if (game.state.remkl==0) finish(FWON);
+           if (alldone) return;
+           kk--; /* don't do the increment */
+       }
+       else /* decide whether or not to emasculate klingon */
+           if (kpow > 0 && Rand() >= 0.9 &&
+               kpow <= ((0.4 + 0.4*Rand())*kpini)) {
+               prout("***Mr. Spock-  \"Captain, the vessel at ",
+                     cramlc(sector,ii,jj));
+               prout("   has just lost its firepower.\"");
+               game.kpower[kk] = -kpow;
+           }
+    }
+    return;
 }
 
index c1a5632b20ec49356a5b8a8a715242a1b788308d..c9d0f7bd2274eab5558eb6b31ed08a6573fbf94f 100644 (file)
--- a/events.c
+++ b/events.c
 #include "sst.h"
 #include <math.h>
 
-void events(void) {
-        int ictbeam=0, ipage=0, istract=0, line, i=0, j, k, l, ixhold=0, iyhold=0;
-        double fintim = game.state.date + Time, datemin, xtime, repair, yank=0;
+void events(void) 
+{
+    int ictbeam=0, ipage=0, istract=0, line, i=0, j, k, l, ixhold=0, iyhold=0;
+    double fintim = game.state.date + Time, datemin, xtime, repair, yank=0;
 
 #ifdef DEBUG
-       if (idebug) prout("EVENTS");
+    if (idebug) prout("EVENTS");
 #endif
 
-       if (stdamtim == 1e30 && game.damage[DRADIO] != 0.0) {
-               /* chart will no longer be updated because radio is dead */
-               stdamtim = game.state.date;
-               for (i=1; i <= GALSIZE ; i++)
-                       for (j=1; j <= GALSIZE; j++)
-                               if (game.starch[i][j] == 1) game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE;
-       }
+    if (stdamtim == 1e30 && game.damage[DRADIO] != 0.0) {
+       /* chart will no longer be updated because radio is dead */
+       stdamtim = game.state.date;
+       for (i=1; i <= GALSIZE ; i++)
+           for (j=1; j <= GALSIZE; j++)
+               if (game.starch[i][j] == 1) 
+                   game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE;
+    }
 
-       for (;;) {
-               /* Select earliest extraneous event, line==0 if no events */
-               line = FSPY;
-               if (alldone) return;
-               datemin = fintim;
-               for (l=1; l<=NEVENTS; l++)
-                       if (game.future[l] < datemin) {
-                               line = l;
-                               datemin = game.future[l];
-                       }
-               xtime = datemin-game.state.date;
-               game.state.date = datemin;
-               /* Decrement Federation resources and recompute remaining time */
-               game.state.remres -= (game.state.remkl+4*game.state.remcom)*xtime;
-               game.state.remtime = game.state.remres/(game.state.remkl+4*game.state.remcom);
-               if (game.state.remtime <=0) {
-                       finish(FDEPLETE);
-                       return;
+    for (;;) {
+       /* Select earliest extraneous event, line==0 if no events */
+       line = FSPY;
+       if (alldone) return;
+       datemin = fintim;
+       for (l=1; l<=NEVENTS; l++)
+           if (game.future[l] < datemin) {
+               line = l;
+               datemin = game.future[l];
+           }
+       xtime = datemin-game.state.date;
+       game.state.date = datemin;
+       /* Decrement Federation resources and recompute remaining time */
+       game.state.remres -= (game.state.remkl+4*game.state.remcom)*xtime;
+       game.state.remtime = game.state.remres/(game.state.remkl+4*game.state.remcom);
+       if (game.state.remtime <=0) {
+           finish(FDEPLETE);
+           return;
+       }
+       /* Is life support adequate? */
+       if (game.damage[DLIFSUP] && condit != IHDOCKED) {
+           if (lsupres < xtime && game.damage[DLIFSUP] > lsupres) {
+               finish(FLIFESUP);
+               return;
+           }
+           lsupres -= xtime;
+           if (game.damage[DLIFSUP] <= xtime) lsupres = inlsr;
+       }
+       /* Fix devices */
+       repair = xtime;
+       if (condit == IHDOCKED) repair /= docfac;
+       /* Don't fix Deathray here */
+       for (l=1; l<=NDEVICES; l++)
+           if (game.damage[l] > 0.0 && l != DDRAY)
+               game.damage[l] -= (game.damage[l]-repair > 0.0 ? repair : game.damage[l]);
+       /* If radio repaired, update star chart and attack reports */
+       if (stdamtim != 1e30 && game.damage[DRADIO] == 0.0) {
+           stdamtim = 1e30;
+           prout("Lt. Uhura- \"Captain, the sub-space radio is working and");
+           prout("   surveillance reports are coming in.");
+           skip(1);
+           for (i=1; i <= GALSIZE ; i++)
+               for (j=1; j <= GALSIZE; j++)
+                   if (game.starch[i][j] >= SUPERNOVA_PLACE) game.starch[i][j] = 1;
+           if (iseenit==0) {
+               attakreport(0);
+               iseenit = 1;
+           }
+           skip(1);
+           prout("   The star chart is now up to date.\"");
+           skip(1);
+       }
+       /* Cause extraneous event LINE to occur */
+       Time -= xtime;
+       switch (line) {
+       case FSNOVA: /* Supernova */
+           if (ipage==0) pause_game(1);
+           ipage=1;
+           snova(0,0);
+           game.future[FSNOVA] = game.state.date + expran(0.5*intime);
+           if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
+           break;
+       case FSPY: /* Check with spy to see if S.C. should tractor beam */
+           if (game.state.nscrem == 0 ||
+               ictbeam+istract > 0 ||
+               condit==IHDOCKED || isatb==1 || iscate==1) return;
+           if (ientesc ||
+               (energy < 2000 && torps < 4 && shield < 1250) ||
+               (game.damage[DPHASER]>0 && (game.damage[DPHOTON]>0 || torps < 4)) ||
+               (game.damage[DSHIELD] > 0 &&
+                (energy < 2500 || game.damage[DPHASER] > 0) &&
+                (torps < 5 || game.damage[DPHOTON] > 0))) {
+               /* Tractor-beam her! */
+               istract=1;
+               yank = square(game.state.isx-quadx) + square(game.state.isy-quady);
+               /********* fall through to FTBEAM code ***********/
+           }
+           else return;
+       case FTBEAM: /* Tractor beam */
+           if (line==FTBEAM) {
+               if (game.state.remcom == 0) {
+                   game.future[FTBEAM] = 1e30;
+                   break;
                }
-               /* Is life support adequate? */
-               if (game.damage[DLIFSUP] && condit != IHDOCKED) {
-                       if (lsupres < xtime && game.damage[DLIFSUP] > lsupres) {
-                               finish(FLIFESUP);
-                               return;
-                       }
-                       lsupres -= xtime;
-                       if (game.damage[DLIFSUP] <= xtime) lsupres = inlsr;
+               i = Rand()*game.state.remcom+1.0;
+               yank = square(game.state.cx[i]-quadx) + square(game.state.cy[i]-quady);
+               if (istract || condit == IHDOCKED || yank == 0) {
+                   /* Drats! Have to reschedule */
+                   game.future[FTBEAM] = game.state.date + Time +
+                       expran(1.5*intime/game.state.remcom);
+                   break;
                }
-               /* Fix devices */
-               repair = xtime;
-               if (condit == IHDOCKED) repair /= docfac;
-               /* Don't fix Deathray here */
-               for (l=1; l<=NDEVICES; l++)
-                       if (game.damage[l] > 0.0 && l != DDRAY)
-                               game.damage[l] -= (game.damage[l]-repair > 0.0 ? repair : game.damage[l]);
-               /* If radio repaired, update star chart and attack reports */
-               if (stdamtim != 1e30 && game.damage[DRADIO] == 0.0) {
-                       stdamtim = 1e30;
-                       prout("Lt. Uhura- \"Captain, the sub-space radio is working and");
-                       prout("   surveillance reports are coming in.");
-                       skip(1);
-                       for (i=1; i <= GALSIZE ; i++)
-                               for (j=1; j <= GALSIZE; j++)
-                                       if (game.starch[i][j] > 999) game.starch[i][j] = 1;
-                       if (iseenit==0) {
-                               attakreport(0);
-                               iseenit = 1;
-                       }
-                       skip(1);
-                       prout("   The star chart is now up to date.\"");
+           }
+           /* tractor beaming cases merge here */
+           yank = sqrt(yank);
+           if (ipage==0) pause_game(1);
+           ipage=1;
+           Time = (10.0/(7.5*7.5))*yank; /* 7.5 is yank rate (warp 7.5) */
+           ictbeam = 1;
+           skip(1);
+           proutn("***");
+           crmshp();
+           prout(" caught in long range tractor beam--");
+           /* If Kirk & Co. screwing around on planet, handle */
+           atover(1); /* atover(1) is Grab */
+           if (alldone) return;
+           if (icraft == 1) { /* Caught in Galileo? */
+               finish(FSTRACTOR);
+               return;
+           }
+           /* Check to see if shuttle is aboard */
+           if (iscraft==0) {
+               skip(1);
+               if (Rand() > 0.5) {
+                   prout("Galileo, left on the planet surface, is captured");
+                   prout("by aliens and made into a flying McDonald's.");
+                   game.damage[DSHUTTL] = -10;
+                   iscraft = -1;
+               }
+               else {
+                   prout("Galileo, left on the planet surface, is well hidden.");
+               }
+           }
+           if (line==0) {
+               quadx = game.state.isx;
+               quady = game.state.isy;
+           }
+           else {
+               quadx = game.state.cx[i];
+               quady = game.state.cy[i];
+           }
+           iran(QUADSIZE, &sectx, &secty);
+           crmshp();
+           proutn(" is pulled to ");
+           proutn(cramlc(quadrant, quadx, quady));
+           proutn(", ");
+           prout(cramlc(sector, sectx, secty));
+           if (resting) {
+               prout("(Remainder of rest/repair period cancelled.)");
+               resting = 0;
+           }
+           if (shldup==0) {
+               if (game.damage[DSHIELD]==0 && shield > 0) {
+                   doshield(2); /* Shldsup */
+                   shldchg=0;
+               }
+               else prout("(Shields not currently useable.)");
+           }
+           newqad(0);
+           /* Adjust finish time to time of tractor beaming */
+           fintim = game.state.date+Time;
+           attack(0);
+           if (game.state.remcom <= 0) game.future[FTBEAM] = 1e30;
+           else game.future[FTBEAM] = game.state.date+Time+expran(1.5*intime/game.state.remcom);
+           break;
+       case FSNAP: /* Snapshot of the universe (for time warp) */
+           game.snapsht = game.state;
+           game.state.snap = 1;
+           game.future[FSNAP] = game.state.date + expran(0.5 * intime);
+           break;
+       case FBATTAK: /* Commander attacks starbase */
+           if (game.state.remcom==0 || game.state.rembase==0) {
+               /* no can do */
+               game.future[FBATTAK] = game.future[FCDBAS] = 1e30;
+               break;
+           }
+           i = 0;
+           for (j=1; j<=game.state.rembase; j++) {
+               for (k=1; k<=game.state.remcom; k++)
+                   if (game.state.baseqx[j]==game.state.cx[k] && game.state.baseqy[j]==game.state.cy[k] &&
+                       (game.state.baseqx[j]!=quadx || game.state.baseqy[j]!=quady) &&
+                       (game.state.baseqx[j]!=game.state.isx || game.state.baseqy[j]!=game.state.isy)) {
+                       i = 1;
+                       break;
+                   }
+               if (i == 1) break;
+           }
+           if (j>game.state.rembase) {
+               /* no match found -- try later */
+               game.future[FBATTAK] = game.state.date + expran(0.3*intime);
+               game.future[FCDBAS] = 1e30;
+               break;
+           }
+           /* commander + starbase combination found -- launch attack */
+           batx = game.state.baseqx[j];
+           baty = game.state.baseqy[j];
+           game.future[FCDBAS] = game.state.date+1.0+3.0*Rand();
+           if (isatb) /* extra time if SC already attacking */
+               game.future[FCDBAS] += game.future[FSCDBAS]-game.state.date;
+           game.future[FBATTAK] = game.future[FCDBAS] +expran(0.3*intime);
+           iseenit = 0;
+           if (game.damage[DRADIO] != 0.0 &&
+               condit != IHDOCKED) break; /* No warning :-( */
+           iseenit = 1;
+           if (ipage==0) pause_game(1);
+           ipage = 1;
+           skip(1);
+           proutn("Lt. Uhura-  \"Captain, the starbase in ");
+           prout(cramlc(quadrant, batx, baty));
+           prout("   reports that it is under attack and that it can");
+           proutn("   hold out only until stardate %d",
+                  (int)game.future[FCDBAS]);
+           prout(".\"");
+           if (resting) {
+               skip(1);
+               proutn("Mr. Spock-  \"Captain, shall we cancel the rest period?\" ");
+               if (ja()) {
+                   resting = 0;
+                   Time = 0.0;
+                   return;
+               }
+           }
+           break;
+       case FSCDBAS: /* Supercommander destroys base */
+           game.future[FSCDBAS] = 1e30;
+           isatb = 2;
+           if (!BASES(game.state.galaxy[game.state.isx][game.state.isy])) 
+               break; /* WAS RETURN! */
+           ixhold = batx;
+           iyhold = baty;
+           batx = game.state.isx;
+           baty = game.state.isy;
+       case FCDBAS: /* Commander succeeds in destroying base */
+           if (line==FCDBAS) {
+               game.future[FCDBAS] = 1e30;
+               /* find the lucky pair */
+               for (i = 1; i <= game.state.remcom; i++)
+                   if (game.state.cx[i]==batx && game.state.cy[i]==baty) break;
+               if (i > game.state.remcom || game.state.rembase == 0 ||
+                   !BASES(game.state.galaxy[batx][baty])) {
+                   /* No action to take after all */
+                   batx = baty = 0;
+                   break;
+               }
+           }
+           /* Code merges here for any commander destroying base */
+           /* Not perfect, but will have to do */
+           if (game.starch[batx][baty] == -1) game.starch[batx][baty] = 0;
+           /* Handle case where base is in same quadrant as starship */
+           if (batx==quadx && baty==quady) {
+               if (game.starch[batx][baty] >= SUPERNOVA_PLACE) game.starch[batx][baty] -= BASE_PLACE;
+               game.quad[basex][basey]= IHDOT;
+               basex=basey=0;
+               newcnd();
+               skip(1);
+               prout("Spock-  \"Captain, I believe the starbase has been destroyegame.state.\"");
+           }
+           else if (game.state.rembase != 1 &&
+                    (game.damage[DRADIO] <= 0.0 || condit == IHDOCKED)) {
+               /* Get word via subspace radio */
+               if (ipage==0) pause_game(1);
+               ipage = 1;
+               skip(1);
+               prout("Lt. Uhura-  \"Captain, Starfleet Command reports that");
+               proutn("   the starbase in ");
+               proutn(cramlc(quadrant, batx, baty));
+               prout(" has been destroyed by");
+               if (isatb==2) prout("the Klingon Super-Commander");
+               else prout("a Klingon Commander");
+           }
+           /* Remove Starbase from galaxy */
+           game.state.galaxy[batx][baty] -= BASE_PLACE;
+           for (i=1; i <= game.state.rembase; i++)
+               if (game.state.baseqx[i]==batx && game.state.baseqy[i]==baty) {
+                   game.state.baseqx[i]=game.state.baseqx[game.state.rembase];
+                   game.state.baseqy[i]=game.state.baseqy[game.state.rembase];
+               }
+           game.state.rembase--;
+           if (isatb == 2) {
+               /* reinstate a commander's base attack */
+               batx = ixhold;
+               baty = iyhold;
+               isatb = 0;
+           }
+           else {
+               batx = baty = 0;
+           }
+           break;
+       case FSCMOVE: /* Supercommander moves */
+           game.future[FSCMOVE] = game.state.date+0.2777;
+           if (ientesc+istract==0 &&
+               isatb!=1 &&
+               (iscate!=1 || justin==1)) scom(&ipage);
+           break;
+       case FDSPROB: /* Move deep space probe */
+           game.future[FDSPROB] = game.state.date + 0.01;
+           probex += probeinx;
+           probey += probeiny;
+           i = (int)(probex/QUADSIZE +0.05);
+           j = (int)(probey/QUADSIZE + 0.05);
+           if (probecx != i || probecy != j) {
+               probecx = i;
+               probecy = j;
+               if (i < 1 || i > GALSIZE || j < 1 || j > GALSIZE ||
+                   game.state.galaxy[probecx][probecy] == SUPERNOVA_PLACE) {
+                   // Left galaxy or ran into supernova
+                   if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) {
+                       if (ipage==0) pause_game(1);
+                       ipage = 1;
                        skip(1);
+                       proutn("Lt. Uhura-  \"The deep space probe ");
+                       if (i < 1 ||i > GALSIZE || j < 1 || j > GALSIZE)
+                           proutn("has left the galaxy");
+                       else
+                           proutn("is no longer transmitting");
+                       prout(".\"");
+                   }
+                   game.future[FDSPROB] = 1e30;
+                   break;
                }
-               /* Cause extraneous event LINE to occur */
-               Time -= xtime;
-               switch (line) {
-                       case FSNOVA: /* Supernova */
-                               if (ipage==0) pause_game(1);
-                               ipage=1;
-                               snova(0,0);
-                               game.future[FSNOVA] = game.state.date + expran(0.5*intime);
-                               if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
-                               break;
-                       case FSPY: /* Check with spy to see if S.C. should tractor beam */
-                               if (game.state.nscrem == 0 ||
-                                       ictbeam+istract > 0 ||
-                                       condit==IHDOCKED || isatb==1 || iscate==1) return;
-                               if (ientesc ||
-                                       (energy < 2000 && torps < 4 && shield < 1250) ||
-                                       (game.damage[DPHASER]>0 && (game.damage[DPHOTON]>0 || torps < 4)) ||
-                                       (game.damage[DSHIELD] > 0 &&
-                                        (energy < 2500 || game.damage[DPHASER] > 0) &&
-                                        (torps < 5 || game.damage[DPHOTON] > 0))) {
-                                       /* Tractor-beam her! */
-                                       istract=1;
-                                       yank = square(game.state.isx-quadx) + square(game.state.isy-quady);
-                                       /*********TBEAM CODE***********/
-                               }
-                               else return;
-                       case FTBEAM: /* Tractor beam */
-                               if (line==FTBEAM) {
-                                       if (game.state.remcom == 0) {
-                                               game.future[FTBEAM] = 1e30;
-                                               break;
-                                       }
-                                       i = Rand()*game.state.remcom+1.0;
-                                       yank = square(game.state.cx[i]-quadx) + square(game.state.cy[i]-quady);
-                                       if (istract || condit == IHDOCKED || yank == 0) {
-                                               /* Drats! Have to reschedule */
-                                               game.future[FTBEAM] = game.state.date + Time +
-                                                                                expran(1.5*intime/game.state.remcom);
-                                               break;
-                                       }
-                               }
-                               /* tractor beaming cases merge here */
-                               yank = sqrt(yank);
-                               if (ipage==0) pause_game(1);
-                               ipage=1;
-                               Time = (10.0/(7.5*7.5))*yank; /* 7.5 is yank rate (warp 7.5) */
-                               ictbeam = 1;
-                               skip(1);
-                               proutn("***");
-                               crmshp();
-                               prout(" caught in long range tractor beam--");
-                               /* If Kirk & Co. screwing around on planet, handle */
-                               atover(1); /* atover(1) is Grab */
-                               if (alldone) return;
-                               if (icraft == 1) { /* Caught in Galileo? */
-                                       finish(FSTRACTOR);
-                                       return;
-                               }
-                               /* Check to see if shuttle is aboard */
-                               if (iscraft==0) {
-                                       skip(1);
-                                       if (Rand() >0.5) {
-                                               prout("Galileo, left on the planet surface, is captured");
-                                               prout("by aliens and made into a flying McDonald's.");
-                                               game.damage[DSHUTTL] = -10;
-                                               iscraft = -1;
-                                       }
-                                       else {
-                                               prout("Galileo, left on the planet surface, is well hidden.");
-                                       }
-                               }
-                               if (line==0) {
-                                       quadx = game.state.isx;
-                                       quady = game.state.isy;
-                               }
-                               else {
-                                       quadx = game.state.cx[i];
-                                       quady = game.state.cy[i];
-                               }
-                               iran10(&sectx, &secty);
-                               crmshp();
-                               proutn(" is pulled to ");
-                               proutn(cramlc(quadrant, quadx, quady));
-                               proutn(", ");
-                               prout(cramlc(sector, sectx, secty));
-                               if (resting) {
-                                       prout("(Remainder of rest/repair period cancellegame.state.)");
-                                       resting = 0;
-                               }
-                               if (shldup==0) {
-                                       if (game.damage[DSHIELD]==0 && shield > 0) {
-                                               doshield(2); /* Shldsup */
-                                               shldchg=0;
-                                       }
-                                       else prout("(Shields not currently useable.)");
-                               }
-                               newqad(0);
-                               /* Adjust finish time to time of tractor beaming */
-                               fintim = game.state.date+Time;
-                                attack(0);
-                               if (game.state.remcom <= 0) game.future[FTBEAM] = 1e30;
-                               else game.future[FTBEAM] = game.state.date+Time+expran(1.5*intime/game.state.remcom);
-                               break;
-                       case FSNAP: /* Snapshot of the universe (for time warp) */
-                               game.snapsht = game.state;
-                               game.state.snap = 1;
-                               game.future[FSNAP] = game.state.date + expran(0.5 * intime);
-                               break;
-                       case FBATTAK: /* Commander attacks starbase */
-                               if (game.state.remcom==0 || game.state.rembase==0) {
-                                       /* no can do */
-                                       game.future[FBATTAK] = game.future[FCDBAS] = 1e30;
-                                       break;
-                               }
-                               i = 0;
-                               for (j=1; j<=game.state.rembase; j++) {
-                                       for (k=1; k<=game.state.remcom; k++)
-                                               if (game.state.baseqx[j]==game.state.cx[k] && game.state.baseqy[j]==game.state.cy[k] &&
-                                                       (game.state.baseqx[j]!=quadx || game.state.baseqy[j]!=quady) &&
-                                                       (game.state.baseqx[j]!=game.state.isx || game.state.baseqy[j]!=game.state.isy)) {
-                                                       i = 1;
-                                                       break;
-                                               }
-                                       if (i == 1) break;
-                               }
-                               if (j>game.state.rembase) {
-                                       /* no match found -- try later */
-                                       game.future[FBATTAK] = game.state.date + expran(0.3*intime);
-                                       game.future[FCDBAS] = 1e30;
-                                       break;
-                               }
-                               /* commander + starbase combination found -- launch attack */
-                               batx = game.state.baseqx[j];
-                               baty = game.state.baseqy[j];
-                               game.future[FCDBAS] = game.state.date+1.0+3.0*Rand();
-                               if (isatb) /* extra time if SC already attacking */
-                                       game.future[FCDBAS] += game.future[FSCDBAS]-game.state.date;
-                               game.future[FBATTAK] = game.future[FCDBAS] +expran(0.3*intime);
-                               iseenit = 0;
-                               if (game.damage[DRADIO] != 0.0 &&
-                                       condit != IHDOCKED) break; /* No warning :-( */
-                               iseenit = 1;
-                               if (ipage==0) pause_game(1);
-                               ipage = 1;
-                               skip(1);
-                               proutn("Lt. Uhura-  \"Captain, the starbase in ");
-                               prout(cramlc(quadrant, batx, baty));
-                               prout("   reports that it is under attack and that it can");
-                               proutn("   hold out only until stardate %d",
-                                       (int)game.future[FCDBAS]);
-                               prout(".\"");
-                               if (resting) {
-                                       skip(1);
-                                       proutn("Mr. Spock-  \"Captain, shall we cancel the rest period?\" ");
-                                       if (ja()) {
-                                               resting = 0;
-                                               Time = 0.0;
-                                               return;
-                                       }
-                               }
-                               break;
-                       case FSCDBAS: /* Supercommander destroys base */
-                               game.future[FSCDBAS] = 1e30;
-                               isatb = 2;
-                               if (game.state.galaxy[game.state.isx][game.state.isy]%ENEMY_PLACE < BASE_PLACE) break; /* WAS RETURN! */
-                               ixhold = batx;
-                               iyhold = baty;
-                               batx = game.state.isx;
-                               baty = game.state.isy;
-                       case FCDBAS: /* Commander succeeds in destroying base */
-                               if (line==FCDBAS) {
-                                       game.future[FCDBAS] = 1e30;
-                                       /* find the lucky pair */
-                                       for (i = 1; i <= game.state.remcom; i++)
-                                               if (game.state.cx[i]==batx && game.state.cy[i]==baty) break;
-                                       if (i > game.state.remcom || game.state.rembase == 0 ||
-                                               game.state.galaxy[batx][baty] % ENEMY_PLACE < BASE_PLACE) {
-                                               /* No action to take after all */
-                                               batx = baty = 0;
-                                               break;
-                                       }
-                               }
-                               /* Code merges here for any commander destroying base */
-                               /* Not perfect, but will have to do */
-                               if (game.starch[batx][baty] == -1) game.starch[batx][baty] = 0;
-                               /* Handle case where base is in same quadrant as starship */
-                               if (batx==quadx && baty==quady) {
-                                       if (game.starch[batx][baty] >= SUPERNOVA_PLACE) game.starch[batx][baty] -= BASE_PLACE;
-                                       game.quad[basex][basey]= IHDOT;
-                                       basex=basey=0;
-                                       newcnd();
-                                       skip(1);
-                                       prout("Spock-  \"Captain, I believe the starbase has been destroyegame.state.\"");
-                               }
-                               else if (game.state.rembase != 1 &&
-                                                (game.damage[DRADIO] <= 0.0 || condit == IHDOCKED)) {
-                                       /* Get word via subspace radio */
-                                       if (ipage==0) pause_game(1);
-                                       ipage = 1;
-                                       skip(1);
-                                       prout("Lt. Uhura-  \"Captain, Starfleet Command reports that");
-                                       proutn("   the starbase in ");
-                                       proutn(cramlc(quadrant, batx, baty));
-                                       prout(" has been destroyed by");
-                                       if (isatb==2) prout("the Klingon Super-Commander");
-                                       else prout("a Klingon Commander");
-                               }
-                               /* Remove Starbase from galaxy */
-                               game.state.galaxy[batx][baty] -= BASE_PLACE;
-                               for (i=1; i <= game.state.rembase; i++)
-                                       if (game.state.baseqx[i]==batx && game.state.baseqy[i]==baty) {
-                                               game.state.baseqx[i]=game.state.baseqx[game.state.rembase];
-                                               game.state.baseqy[i]=game.state.baseqy[game.state.rembase];
-                                       }
-                               game.state.rembase--;
-                               if (isatb == 2) {
-                                       /* reinstate a commander's base attack */
-                                       batx = ixhold;
-                                       baty = iyhold;
-                                       isatb = 0;
-                               }
-                               else {
-                                       batx = baty = 0;
-                               }
-                               break;
-                       case FSCMOVE: /* Supercommander moves */
-                               game.future[FSCMOVE] = game.state.date+0.2777;
-                               if (ientesc+istract==0 &&
-                                       isatb!=1 &&
-                                       (iscate!=1 || justin==1)) scom(&ipage);
-                               break;
-                       case FDSPROB: /* Move deep space probe */
-                               game.future[FDSPROB] = game.state.date + 0.01;
-                               probex += probeinx;
-                               probey += probeiny;
-                               i = (int)(probex/QUADSIZE +0.05);
-                               j = (int)(probey/QUADSIZE + 0.05);
-                               if (probecx != i || probecy != j) {
-                                       probecx = i;
-                                       probecy = j;
-                                       if (i < 1 || i > GALSIZE || j < 1 || j > GALSIZE ||
-                                               game.state.galaxy[probecx][probecy] == SUPERNOVA_PLACE) {
-                                               // Left galaxy or ran into supernova
-                                               if (game.damage[DRADIO]==0.0 || condit == IHDOCKED) {
-                                                       if (ipage==0) pause_game(1);
-                                                       ipage = 1;
-                                                       skip(1);
-                                                       proutn("Lt. Uhura-  \"The deep space probe ");
-                                                       if (i < 1 ||i > GALSIZE || j < 1 || j > GALSIZE)
-                                                               proutn("has left the galaxy");
-                                                       else
-                                                               proutn("is no longer transmitting");
-                                                       prout(".\"");
-                                               }
-                                               game.future[FDSPROB] = 1e30;
-                                               break;
-                                       }
-                                       if (game.damage[DRADIO]==0.0   || condit == IHDOCKED) {
-                                               if (ipage==0) pause_game(1);
-                                               ipage = 1;
-                                               skip(1);
-                                               proutn("Lt. Uhura-  \"The deep space probe is now in ");
-                                               proutn(cramlc(quadrant, probecx, probecy));
-                                               prout(".\"");
-                                       }
-                               }
-                               /* Update star chart if Radio is working or have access to
-                                  radio. */
-                               if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED)
-                                       game.starch[probecx][probecy] = game.damage[DRADIO] > 0.0 ?
-                                                                                  game.state.galaxy[probecx][probecy]+SUPERNOVA_PLACE : 1;
-                               proben--; // One less to travel
-                               if (proben == 0 && isarmed &&
-                                       game.state.galaxy[probecx][probecy] % BASE_PLACE > 0) {
-                                       /* lets blow the sucker! */
-                                       snova(1,0);
-                                       game.future[FDSPROB] = 1e30;
-                                       if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
-                               }
-                               break;
+               if (game.damage[DRADIO]==0.0   || condit == IHDOCKED) {
+                   if (ipage==0) pause_game(1);
+                   ipage = 1;
+                   skip(1);
+                   proutn("Lt. Uhura-  \"The deep space probe is now in ");
+                   proutn(cramlc(quadrant, probecx, probecy));
+                   prout(".\"");
                }
+           }
+           /* Update star chart if Radio is working or have access to
+              radio. */
+           if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED)
+               game.starch[probecx][probecy] = game.damage[DRADIO] > 0.0 ?
+                   game.state.galaxy[probecx][probecy]+SUPERNOVA_PLACE : 1;
+           proben--; // One less to travel
+           if (proben == 0 && isarmed &&
+               STARS(game.state.galaxy[probecx][probecy])) {
+               /* lets blow the sucker! */
+               snova(1,0);
+               game.future[FDSPROB] = 1e30;
+               if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) return;
+           }
+           break;
        }
+    }
 }
 
                                
-void wait(void) {
-       int key;
-       double temp, delay, origTime;
+void wait(void) 
+{
+    int key;
+    double temp, delay, origTime;
 
-       ididit = 0;
-       for (;;) {
-               key = scan();
-               if (key  != IHEOL) break;
-               proutn("How long? ");
-       }
-       chew();
-       if (key != IHREAL) {
-               huh();
-               return;
-       }
-       origTime = delay = aaitem;
-       if (delay <= 0.0) return;
-       if (delay >= game.state.remtime || nenhere != 0) {
-               proutn("Are you sure? ");
-               if (ja() == 0) return;
-       }
+    ididit = 0;
+    for (;;) {
+       key = scan();
+       if (key  != IHEOL) break;
+       proutn("How long? ");
+    }
+    chew();
+    if (key != IHREAL) {
+       huh();
+       return;
+    }
+    origTime = delay = aaitem;
+    if (delay <= 0.0) return;
+    if (delay >= game.state.remtime || nenhere != 0) {
+       proutn("Are you sure? ");
+       if (ja() == 0) return;
+    }
 
-       /* Alternate resting periods (events) with attacks */
+    /* Alternate resting periods (events) with attacks */
 
-       resting = 1;
-       do {
-               if (delay <= 0) resting = 0;
-               if (resting == 0) {
-                       prout("%d stardates left.", (int)game.state.remtime);
-                       return;
-               }
-               temp = Time = delay;
+    resting = 1;
+    do {
+       if (delay <= 0) resting = 0;
+       if (resting == 0) {
+           prout("%d stardates left.", (int)game.state.remtime);
+           return;
+       }
+       temp = Time = delay;
 
-               if (nenhere) {
-                       double rtime = 1.0 + Rand();
-                       if (rtime < temp) temp = rtime;
-                       Time = temp;
-               }
-               if (Time < delay) attack(0);
-               if (alldone) return;
-               events();
-               ididit = 1;
-               if (alldone) return;
-               delay -= temp;
-               /* Repair Deathray if long rest at starbase */
-               if (origTime-delay >= 9.99 && condit == IHDOCKED)
-                       game.damage[DDRAY] = 0.0;
-       } while (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE); // leave if quadrant supernovas
+       if (nenhere) {
+           double rtime = 1.0 + Rand();
+           if (rtime < temp) temp = rtime;
+           Time = temp;
+       }
+       if (Time < delay) attack(0);
+       if (alldone) return;
+       events();
+       ididit = 1;
+       if (alldone) return;
+       delay -= temp;
+       /* Repair Deathray if long rest at starbase */
+       if (origTime-delay >= 9.99 && condit == IHDOCKED)
+           game.damage[DDRAY] = 0.0;
+    } while 
+       (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE); // leave if quadrant supernovas
 
-       resting = 0;
-       Time = 0;
+    resting = 0;
+    Time = 0;
 }
 
-void nova(int ix, int iy) {
-       static double course[] =
-               {0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5};
-        int bot, top, top2, hits[QUADSIZE+1][3], kount, icx, icy, mm, nn, j;
-       int iquad, iquad1, i, ll, newcx, newcy, ii, jj;
-       if (Rand() < 0.05) {
-               /* Wow! We've supernova'ed */
-               snova(ix, iy);
-               return;
-       }
+void nova(int ix, int iy) 
+{
+    static double course[] =
+       {0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5};
+    int bot, top, top2, hits[QUADSIZE+1][3], kount, icx, icy, mm, nn, j;
+    int iquad, iquad1, i, ll, newcx, newcy, ii, jj;
+    if (Rand() < 0.05) {
+       /* Wow! We've supernova'ed */
+       snova(ix, iy);
+       return;
+    }
 
-       /* handle initial nova */
-       game.quad[ix][iy] = IHDOT;
-       crmena(1, IHSTAR, 2, ix, iy);
-       prout(" novas.");
-       game.state.galaxy[quadx][quady] -= 1;
-       game.state.starkl++;
+    /* handle initial nova */
+    game.quad[ix][iy] = IHDOT;
+    crmena(1, IHSTAR, 2, ix, iy);
+    prout(" novas.");
+    game.state.galaxy[quadx][quady] -= 1;
+    game.state.starkl++;
        
-       /* Set up stack to recursively trigger adjacent stars */
-       bot = top = top2 = 1;
-       kount = 0;
-       icx = icy = 0;
-       hits[1][1] = ix;
-       hits[1][2] = iy;
-       while (1) {
-               for (mm = bot; mm <= top; mm++) 
-               for (nn = 1; nn <= 3; nn++)  /* nn,j represents coordinates around current */
-                       for (j = 1; j <= 3; j++) {
-                               if (j==2 && nn== 2) continue;
-                               ii = hits[mm][1]+nn-2;
-                               jj = hits[mm][2]+j-2;
-                               if (ii < 1 || ii > QUADSIZE || jj < 1 || jj > QUADSIZE) continue;
-                               iquad = game.quad[ii][jj];
-                               switch (iquad) {
-//                                     case IHDOT:     /* Empty space ends reaction
-//                                     case IHQUEST:
-//                                     case IHBLANK:
-//                                     case IHT:
-//                                     case IHWEB:
-                                       default:
-                                               break;
-                                       case IHSTAR: /* Affect another star */
-                                               if (Rand() < 0.05) {
-                                                       /* This star supernovas */
-                                                       snova(ii,jj);
-                                                       return;
-                                               }
-                                               top2++;
-                                               hits[top2][1]=ii;
-                                               hits[top2][2]=jj;
-                                               game.state.galaxy[quadx][quady] -= 1;
-                                               game.state.starkl++;
-                                               crmena(1, IHSTAR, 2, ii, jj);
-                                               prout(" novas.");
-                                               game.quad[ii][jj] = IHDOT;
-                                               break;
-                                       case IHP: /* Destroy planet */
-                                               game.state.newstuf[quadx][quady] -= 1;
-                                               game.state.nplankl++;
-                                               crmena(1, IHP, 2, ii, jj);
-                                               prout(" destroyed.");
-                                               DESTROY(&game.state.plnets[iplnet]);
-                                               iplnet = plnetx = plnety = 0;
-                                               if (landed == 1) {
-                                                       finish(FPNOVA);
-                                                       return;
-                                               }
-                                               game.quad[ii][jj] = IHDOT;
-                                               break;
-                                       case IHB: /* Destroy base */
-                                               game.state.galaxy[quadx][quady] -= BASE_PLACE;
-                                               for (i = 1; i <= game.state.rembase; i++)
-                                                       if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady) break;
-                                               game.state.baseqx[i] = game.state.baseqx[game.state.rembase];
-                                               game.state.baseqy[i] = game.state.baseqy[game.state.rembase];
-                                               game.state.rembase--;
-                                               basex = basey = 0;
-                                               game.state.basekl++;
-                                               newcnd();
-                                               crmena(1, IHB, 2, ii, jj);
-                                               prout(" destroyed.");
-                                               game.quad[ii][jj] = IHDOT;
-                                               break;
-                                       case IHE: /* Buffet ship */
-                                       case IHF:
-                                               prout("***Starship buffeted by nova.");
-                                               if (shldup) {
-                                                       if (shield >= 2000.0) shield -= 2000.0;
-                                                       else {
-                                                               double diff = 2000.0 - shield;
-                                                               energy -= diff;
-                                                               shield = 0.0;
-                                                               shldup = 0;
-                                                               prout("***Shields knocked out.");
-                                                               game.damage[DSHIELD] += 0.005*damfac*Rand()*diff;
-                                                       }
-                                               }
-                                               else energy -= 2000.0;
-                                               if (energy <= 0) {
-                                                       finish(FNOVA);
-                                                       return;
-                                               }
-                                               /* add in course nova contributes to kicking starship*/
-                                               icx += sectx-hits[mm][1];
-                                               icy += secty-hits[mm][2];
-                                               kount++;
-                                               break;
-                                       case IHK: /* kill klingon */
-                                               deadkl(ii,jj,iquad, ii, jj);
-                                               break;
-                                       case IHC: /* Damage/destroy big enemies */
-                                       case IHS:
-                                       case IHR:
-                                               for (ll = 1; ll <= nenhere; ll++)
-                                                       if (game.kx[ll]==ii && game.ky[ll]==jj) break;
-                                               game.kpower[ll] -= 800.0; /* If firepower is lost, die */
-                                               if (game.kpower[ll] <= 0.0) {
-                                                       deadkl(ii, jj, iquad, ii, jj);
-                                                       break;
-                                               }
-                                               newcx = ii + ii - hits[mm][1];
-                                               newcy = jj + jj - hits[mm][2];
-                                               crmena(1, iquad, 2, ii, jj);
-                                               proutn(" damaged");
-                                               if (newcx<1 || newcx>QUADSIZE || newcy<1 || newcy>QUADSIZE) {
-                                                       /* can't leave quadrant */
-                                                       skip(1);
-                                                       break;
-                                               }
-                                               iquad1 = game.quad[newcx][newcy];
-                                               if (iquad1 == IHBLANK) {
-                                                       proutn(", blasted into ");
-                                                       crmena(0, IHBLANK, 2, newcx, newcy);
-                                                       skip(1);
-                                                       deadkl(ii, jj, iquad, newcx, newcy);
-                                                       break;
-                                               }
-                                               if (iquad1 != IHDOT) {
-                                                       /* can't move into something else */
-                                                       skip(1);
-                                                       break;
-                                               }
-                                               proutn(", buffeted to ");
-                                               proutn(cramlc(sector, newcx, newcy));
-                                               game.quad[ii][jj] = IHDOT;
-                                               game.quad[newcx][newcy] = iquad;
-                                               game.kx[ll] = newcx;
-                                               game.ky[ll] = newcy;
-                                               game.kavgd[ll] = sqrt(square(sectx-newcx)+square(secty-newcy));
-                                               game.kdist[ll] = game.kavgd[ll];
-                                               skip(1);
-                                               break;
-                               }
+    /* Set up stack to recursively trigger adjacent stars */
+    bot = top = top2 = 1;
+    kount = 0;
+    icx = icy = 0;
+    hits[1][1] = ix;
+    hits[1][2] = iy;
+    while (1) {
+       for (mm = bot; mm <= top; mm++) 
+           for (nn = 1; nn <= 3; nn++)  /* nn,j represents coordinates around current */
+               for (j = 1; j <= 3; j++) {
+                   if (j==2 && nn== 2) continue;
+                   ii = hits[mm][1]+nn-2;
+                   jj = hits[mm][2]+j-2;
+                   if (ii < 1 || ii > QUADSIZE || jj < 1 || jj > QUADSIZE) continue;
+                   iquad = game.quad[ii][jj];
+                   switch (iquad) {
+                   // case IHDOT:      /* Empty space ends reaction
+                   // case IHQUEST:
+                   // case IHBLANK:
+                   // case IHT:
+                   // case IHWEB:
+                   default:
+                       break;
+                   case IHSTAR: /* Affect another star */
+                       if (Rand() < 0.05) {
+                           /* This star supernovas */
+                           snova(ii,jj);
+                           return;
                        }
-               if (top == top2) break;
-               bot = top + 1;
-               top = top2;
-       }
-       if (kount==0) return;
-
-       /* Starship affected by nova -- kick it away. */
-       dist = kount*0.1;
-       if (icx) icx = (icx < 0 ? -1 : 1);
-       if (icy) icy = (icy < 0 ? -1 : 1);
-       direc = course[3*(icx+1)+icy+2];
-       if (direc == 0.0) dist = 0.0;
-       if (dist == 0.0) return;
-       Time = 10.0*dist/16.0;
-       skip(1);
-       prout("Force of nova displaces starship.");
-       iattak=2;       /* Eliminates recursion problem */
-       imove();
-       Time = 10.0*dist/16.0;
+                       top2++;
+                       hits[top2][1]=ii;
+                       hits[top2][2]=jj;
+                       game.state.galaxy[quadx][quady] -= 1;
+                       game.state.starkl++;
+                       crmena(1, IHSTAR, 2, ii, jj);
+                       prout(" novas.");
+                       game.quad[ii][jj] = IHDOT;
+                       break;
+                   case IHP: /* Destroy planet */
+                       game.state.newstuf[quadx][quady] -= 1;
+                       game.state.nplankl++;
+                       crmena(1, IHP, 2, ii, jj);
+                       prout(" destroyed.");
+                       DESTROY(&game.state.plnets[iplnet]);
+                       iplnet = plnetx = plnety = 0;
+                       if (landed == 1) {
+                           finish(FPNOVA);
+                           return;
+                       }
+                       game.quad[ii][jj] = IHDOT;
+                       break;
+                   case IHB: /* Destroy base */
+                       game.state.galaxy[quadx][quady] -= BASE_PLACE;
+                       for (i = 1; i <= game.state.rembase; i++)
+                           if (game.state.baseqx[i]==quadx && game.state.baseqy[i]==quady) break;
+                       game.state.baseqx[i] = game.state.baseqx[game.state.rembase];
+                       game.state.baseqy[i] = game.state.baseqy[game.state.rembase];
+                       game.state.rembase--;
+                       basex = basey = 0;
+                       game.state.basekl++;
+                       newcnd();
+                       crmena(1, IHB, 2, ii, jj);
+                       prout(" destroyed.");
+                       game.quad[ii][jj] = IHDOT;
+                       break;
+                   case IHE: /* Buffet ship */
+                   case IHF:
+                       prout("***Starship buffeted by nova.");
+                       if (shldup) {
+                           if (shield >= 2000.0) shield -= 2000.0;
+                           else {
+                               double diff = 2000.0 - shield;
+                               energy -= diff;
+                               shield = 0.0;
+                               shldup = 0;
+                               prout("***Shields knocked out.");
+                               game.damage[DSHIELD] += 0.005*damfac*Rand()*diff;
+                           }
+                       }
+                       else energy -= 2000.0;
+                       if (energy <= 0) {
+                           finish(FNOVA);
+                           return;
+                       }
+                       /* add in course nova contributes to kicking starship*/
+                       icx += sectx-hits[mm][1];
+                       icy += secty-hits[mm][2];
+                       kount++;
+                       break;
+                   case IHK: /* kill klingon */
+                       deadkl(ii,jj,iquad, ii, jj);
+                       break;
+                   case IHC: /* Damage/destroy big enemies */
+                   case IHS:
+                   case IHR:
+                       for (ll = 1; ll <= nenhere; ll++)
+                           if (game.kx[ll]==ii && game.ky[ll]==jj) break;
+                       game.kpower[ll] -= 800.0; /* If firepower is lost, die */
+                       if (game.kpower[ll] <= 0.0) {
+                           deadkl(ii, jj, iquad, ii, jj);
+                           break;
+                       }
+                       newcx = ii + ii - hits[mm][1];
+                       newcy = jj + jj - hits[mm][2];
+                       crmena(1, iquad, 2, ii, jj);
+                       proutn(" damaged");
+                       if (newcx<1 || newcx>QUADSIZE || newcy<1 || newcy>QUADSIZE) {
+                           /* can't leave quadrant */
+                           skip(1);
+                           break;
+                       }
+                       iquad1 = game.quad[newcx][newcy];
+                       if (iquad1 == IHBLANK) {
+                           proutn(", blasted into ");
+                           crmena(0, IHBLANK, 2, newcx, newcy);
+                           skip(1);
+                           deadkl(ii, jj, iquad, newcx, newcy);
+                           break;
+                       }
+                       if (iquad1 != IHDOT) {
+                           /* can't move into something else */
+                           skip(1);
+                           break;
+                       }
+                       proutn(", buffeted to ");
+                       proutn(cramlc(sector, newcx, newcy));
+                       game.quad[ii][jj] = IHDOT;
+                       game.quad[newcx][newcy] = iquad;
+                       game.kx[ll] = newcx;
+                       game.ky[ll] = newcy;
+                       game.kavgd[ll] = sqrt(square(sectx-newcx)+square(secty-newcy));
+                       game.kdist[ll] = game.kavgd[ll];
+                       skip(1);
+                       break;
+                   }
+               }
+       if (top == top2) 
+           break;
+       bot = top + 1;
+       top = top2;
+    }
+    if (kount==0) 
        return;
+
+    /* Starship affected by nova -- kick it away. */
+    dist = kount*0.1;
+    if (icx) icx = (icx < 0 ? -1 : 1);
+    if (icy) icy = (icy < 0 ? -1 : 1);
+    direc = course[3*(icx+1)+icy+2];
+    if (direc == 0.0) dist = 0.0;
+    if (dist == 0.0) return;
+    Time = 10.0*dist/16.0;
+    skip(1);
+    prout("Force of nova displaces starship.");
+    iattak=2;  /* Eliminates recursion problem */
+    imove();
+    Time = 10.0*dist/16.0;
+    return;
 }
        
        
-void snova(int insx, int insy) {
-        int comdead, nqx=0, nqy=0, nsx, nsy, num, kldead, iscdead;
-       int nrmdead, npdead;
-       int insipient=0;
+void snova(int insx, int insy) 
+{
+    int comdead, nqx=0, nqy=0, nsx, nsy, num, kldead, iscdead;
+    int nrmdead, npdead;
+    int incipient=0;
 
-       nsx = insy;
-       nsy = insy;
+    nsx = insy;
+    nsy = insy;
 
-       if (insy== 0) {
-               if (insx == 1) {
-                       /* NOVAMAX being used */
-                       nqx = probecx;
-                       nqy = probecy;
-               }
-               else {
-                       int stars = 0;
-                       /* Scheduled supernova -- select star */
-                       /* logic changed here so that we won't favor quadrants in top
-                       left of universe */
-                       for (nqx = 1; nqx<=GALSIZE; nqx++) {
-                               for (nqy = 1; nqy<=GALSIZE; nqy++) {
-                                       stars += game.state.galaxy[nqx][nqy] % BASE_PLACE;
-                               }
-                       }
-                       if (stars == 0) return; /* nothing to supernova exists */
-                       num = Rand()*stars + 1;
-                       for (nqx = 1; nqx<=GALSIZE; nqx++) {
-                               for (nqy = 1; nqy<=GALSIZE; nqy++) {
-                                       num -= game.state.galaxy[nqx][nqy] % BASE_PLACE;
-                                       if (num <= 0) break;
-                               }
-                               if (num <=0) break;
-                       }
-#ifdef DEBUG
-                       if (idebug) {
-                               proutn("Super nova here?");
-                               if (ja()==1) {
-                                       nqx = quadx;
-                                       nqy = quady;
-                               }
-                       }
-#endif
+    if (insy== 0) {
+       if (insx == 1) {
+           /* NOVAMAX being used */
+           nqx = probecx;
+           nqy = probecy;
+       }
+       else {
+           int stars = 0;
+           /* Scheduled supernova -- select star */
+           /* logic changed here so that we won't favor quadrants in top
+              left of universe */
+           for (nqx = 1; nqx<=GALSIZE; nqx++) {
+               for (nqy = 1; nqy<=GALSIZE; nqy++) {
+                   stars += STARS(game.state.galaxy[nqx][nqy]);
                }
-
-               if (nqx != quady || nqy != quady || justin != 0) {
-                       /* it isn't here, or we just entered (treat as inroute) */
-                       if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) {
-                               skip(1);
-                               prout("Message from Starfleet Command       Stardate %.2f", game.state.date);
-                               prout("     Supernova in %s; caution advised.",
-                                      cramlc(quadrant, nqx, nqy));
-                       }
+           }
+           if (stars == 0) return; /* nothing to supernova exists */
+           num = Rand()*stars + 1;
+           for (nqx = 1; nqx<=GALSIZE; nqx++) {
+               for (nqy = 1; nqy<=GALSIZE; nqy++) {
+                   num -= STARS(game.state.galaxy[nqx][nqy]);
+                   if (num <= 0) break;
                }
-               else {
-                       /* we are in the quadrant! */
-                       insipient = 1;
-                       num = Rand()* (game.state.galaxy[nqx][nqy]%BASE_PLACE) + 1;
-                       for (nsx=1; nsx < QUADSIZE; nsx++) {
-                               for (nsy=1; nsy < QUADSIZE; nsy++) {
-                                       if (game.quad[nsx][nsy]==IHSTAR) {
-                                               num--;
-                                               if (num==0) break;
-                                       }
-                               }
-                               if (num==0) break;
-                       }
+               if (num <=0) break;
+           }
+#ifdef DEBUG
+           if (idebug) {
+               proutn("Super nova here?");
+               if (ja()==1) {
+                   nqx = quadx;
+                   nqy = quady;
                }
-       }
-       else {
-               insipient = 1;
+           }
+#endif
        }
 
-       if (insipient) {
+       if (nqx != quady || nqy != quady || justin != 0) {
+           /* it isn't here, or we just entered (treat as inroute) */
+           if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED) {
                skip(1);
-               prouts("***RED ALERT!  RED ALERT!");
-               skip(1);
-               prout("***Incipient supernova detected at ", cramlc(sector, nsx, nsy));
-               nqx = quadx;
-               nqy = quady;
-               if (square(nsx-sectx) + square(nsy-secty) <= 2.1) {
-                       proutn("Emergency override attempts t");
-                       prouts("***************");
-                       skip(1);
-                       stars();
-                       alldone=1;
-               }
+               prout("Message from Starfleet Command       Stardate %.2f", game.state.date);
+               prout("     Supernova in %s; caution advised.",
+                     cramlc(quadrant, nqx, nqy));
+           }
        }
-       /* destroy any Klingons in supernovaed quadrant */
-       num=game.state.galaxy[nqx][nqy];
-       kldead = num/100;
-       comdead = iscdead = 0;
-       if (nqx==game.state.isx && nqy == game.state.isy) {
-               /* did in the Supercommander! */
-               game.state.nscrem = game.state.isx = game.state.isy = isatb = iscate = 0;
-               iscdead = 1;
-               game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;
-       }
-       game.state.remkl -= kldead;
-       if (game.state.remcom) {
-               int maxloop = game.state.remcom, l;
-               for (l = 1; l <= maxloop; l++) {
-                       if (game.state.cx[l] == nqx && game.state.cy[l] == nqy) {
-                               game.state.cx[l] = game.state.cx[game.state.remcom];
-                               game.state.cy[l] = game.state.cy[game.state.remcom];
-                               game.state.cx[game.state.remcom] = game.state.cy[game.state.remcom] = 0;
-                               game.state.remcom--;
-                               kldead--;
-                               comdead++;
-                               if (game.state.remcom==0) game.future[FTBEAM] = 1e30;
-                               break;
-                       }
+       else {
+           /* we are in the quadrant! */
+           incipient = 1;
+           num = Rand()* STARS(game.state.galaxy[nqx][nqy]) + 1;
+           for (nsx=1; nsx < QUADSIZE; nsx++) {
+               for (nsy=1; nsy < QUADSIZE; nsy++) {
+                   if (game.quad[nsx][nsy]==IHSTAR) {
+                       num--;
+                       if (num==0) break;
+                   }
                }
+               if (num==0) break;
+           }
        }
-       /* destroy Romulans and planets in supernovaed quadrant */
-       num = game.state.newstuf[nqx][nqy];
-       game.state.newstuf[nqx][nqy] = 0;
-       nrmdead = num/10;
-       game.state.nromrem -= nrmdead;
-       npdead = num - nrmdead*10;
-       if (npdead) {
-               int l;
-               for (l = 0; l < inplan; l++)
-                       if (game.state.plnets[l].x == nqx && game.state.plnets[l].y == nqy) {
-                           DESTROY(&game.state.plnets[l]);
-                       }
-       }
-       /* Destroy any base in supernovaed quadrant */
-       if (game.state.rembase) {
-               int maxloop = game.state.rembase, l;
-               for (l = 1; l <= maxloop; l++)
-                       if (game.state.baseqx[l]==nqx && game.state.baseqy[l]==nqy) {
-                               game.state.baseqx[l] = game.state.baseqx[game.state.rembase];
-                               game.state.baseqy[l] = game.state.baseqy[game.state.rembase];
-                               game.state.baseqx[game.state.rembase] = game.state.baseqy[game.state.rembase] = 0;
-                               game.state.rembase--;
-                               break;
-                       }
-       }
-       /* If starship caused supernova, tally up destruction */
-       if (insx) {
-               num = game.state.galaxy[nqx][nqy] % 100;
-               game.state.starkl += num % 10;
-               game.state.basekl += num/10;
-               game.state.killk += kldead;
-               game.state.killc += comdead;
-               game.state.nromkl += nrmdead;
-               game.state.nplankl += npdead;
-               game.state.nsckill += iscdead;
+    }
+    else {
+       incipient = 1;
+    }
+
+    if (incipient) {
+       skip(1);
+       prouts("***RED ALERT!  RED ALERT!");
+       skip(1);
+       prout("***Incipient supernova detected at ", cramlc(sector, nsx, nsy));
+       nqx = quadx;
+       nqy = quady;
+       if (square(nsx-sectx) + square(nsy-secty) <= 2.1) {
+           proutn("Emergency override attempts t");
+           prouts("***************");
+           skip(1);
+           stars();
+           alldone=1;
        }
-       /* mark supernova in galaxy and in star chart */
-       if ((quadx == nqx && quady == nqy) ||
-               game.damage[DRADIO] == 0 ||
-               condit == IHDOCKED)
-               game.starch[nqx][nqy] = 1;
-       game.state.galaxy[nqx][nqy] = SUPERNOVA_PLACE;
-       /* If supernova destroys last klingons give special message */
-       if (game.state.remkl==0 && (nqx != quadx || nqy != quady)) {
-               skip(2);
-               if (insx == 0) prout("Lucky you!");
-               proutn("A supernova in %s has just destroyed the last Klingons.",
-                      cramlc(quadrant, nqx, nqy));
-               finish(FWON);
-               return;
+    }
+    /* destroy any Klingons in supernovaed quadrant */
+    num=game.state.galaxy[nqx][nqy];
+    kldead = num/100;
+    comdead = iscdead = 0;
+    if (nqx==game.state.isx && nqy == game.state.isy) {
+       /* did in the Supercommander! */
+       game.state.nscrem = game.state.isx = game.state.isy = isatb = iscate = 0;
+       iscdead = 1;
+       game.future[FSCMOVE] = game.future[FSCDBAS] = 1e30;
+    }
+    game.state.remkl -= kldead;
+    if (game.state.remcom) {
+       int maxloop = game.state.remcom, l;
+       for (l = 1; l <= maxloop; l++) {
+           if (game.state.cx[l] == nqx && game.state.cy[l] == nqy) {
+               game.state.cx[l] = game.state.cx[game.state.remcom];
+               game.state.cy[l] = game.state.cy[game.state.remcom];
+               game.state.cx[game.state.remcom] = game.state.cy[game.state.remcom] = 0;
+               game.state.remcom--;
+               kldead--;
+               comdead++;
+               if (game.state.remcom==0) game.future[FTBEAM] = 1e30;
+               break;
+           }
        }
-       /* if some Klingons remain, continue or die in supernova */
-       if (alldone) finish(FSNOVAED);
+    }
+    /* destroy Romulans and planets in supernovaed quadrant */
+    num = game.state.newstuf[nqx][nqy];
+    game.state.newstuf[nqx][nqy] = 0;
+    nrmdead = num/10;
+    game.state.nromrem -= nrmdead;
+    npdead = num - nrmdead*10;
+    if (npdead) {
+       int l;
+       for (l = 0; l < inplan; l++)
+           if (game.state.plnets[l].x == nqx && game.state.plnets[l].y == nqy) {
+               DESTROY(&game.state.plnets[l]);
+           }
+    }
+    /* Destroy any base in supernovaed quadrant */
+    if (game.state.rembase) {
+       int maxloop = game.state.rembase, l;
+       for (l = 1; l <= maxloop; l++)
+           if (game.state.baseqx[l]==nqx && game.state.baseqy[l]==nqy) {
+               game.state.baseqx[l] = game.state.baseqx[game.state.rembase];
+               game.state.baseqy[l] = game.state.baseqy[game.state.rembase];
+               game.state.baseqx[game.state.rembase] = game.state.baseqy[game.state.rembase] = 0;
+               game.state.rembase--;
+               break;
+           }
+    }
+    /* If starship caused supernova, tally up destruction */
+    if (insx) {
+       num = game.state.galaxy[nqx][nqy] % 100;
+       game.state.starkl += num % 10;
+       game.state.basekl += num/10;
+       game.state.killk += kldead;
+       game.state.killc += comdead;
+       game.state.nromkl += nrmdead;
+       game.state.nplankl += npdead;
+       game.state.nsckill += iscdead;
+    }
+    /* mark supernova in galaxy and in star chart */
+    if ((quadx == nqx && quady == nqy) ||
+       game.damage[DRADIO] == 0 ||
+       condit == IHDOCKED)
+       game.starch[nqx][nqy] = 1;
+    game.state.galaxy[nqx][nqy] = SUPERNOVA_PLACE;
+    /* If supernova destroys last klingons give special message */
+    if (game.state.remkl==0 && (nqx != quadx || nqy != quady)) {
+       skip(2);
+       if (insx == 0) prout("Lucky you!");
+       proutn("A supernova in %s has just destroyed the last Klingons.",
+              cramlc(quadrant, nqx, nqy));
+       finish(FWON);
        return;
+    }
+    /* if some Klingons remain, continue or die in supernova */
+    if (alldone) finish(FSNOVAED);
+    return;
 }
                
                                
index e3ace26732e2fef5cb47715c2ab18ef5d1723374..ae70c4c0f8c39ea43833635658d64424a3dfa5e0 100644 (file)
--- a/finish.c
+++ b/finish.c
 #include <string.h>
 #include <time.h>
 
-void dstrct() {
-       /* Finish with a BANG! */
-       chew();
-       if (game.damage[DCOMPTR] != 0.0) {
-               prout("Computer damaged; cannot execute destruct sequence.");
-               return;
-       }
-       prouts("---WORKING---"); skip(1);
-        prouts("SELF-DESTRUCT-SEQUENCE-ACTIVATED"); skip(1);
-       prouts("   10"); skip(1);
-       prouts("       9"); skip(1);
-       prouts("          8"); skip(1);
-       prouts("             7"); skip(1);
-       prouts("                6"); skip(1);
-       skip(1);
-       prout("ENTER-CORRECT-PASSWORD-TO-CONTINUE-");
-       skip(1);
-       prout("SELF-DESTRUCT-SEQUENCE-OTHERWISE-");
-       skip(1);
-       prout("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED");
+void dstrct() 
+{
+    /* Finish with a BANG! */
+    chew();
+    if (game.damage[DCOMPTR] != 0.0) {
+       prout("Computer damaged; cannot execute destruct sequence.");
+       return;
+    }
+    prouts("---WORKING---"); skip(1);
+    prouts("SELF-DESTRUCT-SEQUENCE-ACTIVATED"); skip(1);
+    prouts("   10"); skip(1);
+    prouts("       9"); skip(1);
+    prouts("          8"); skip(1);
+    prouts("             7"); skip(1);
+    prouts("                6"); skip(1);
+    skip(1);
+    prout("ENTER-CORRECT-PASSWORD-TO-CONTINUE-");
+    skip(1);
+    prout("SELF-DESTRUCT-SEQUENCE-OTHERWISE-");
+    skip(1);
+    prout("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED");
+    skip(1);
+    scan();
+    chew();
+    if (strcmp(game.passwd, citem) != 0) {
+       prouts("PASSWORD-REJECTED;"); skip(1);
+       prouts("CONTINUITY-EFFECTED");
+       skip(2);
+       return;
+    }
+    prouts("PASSWORD-ACCEPTED"); skip(1);
+    prouts("                   5"); skip(1);
+    prouts("                      4"); skip(1);
+    prouts("                         3"); skip(1);
+    prouts("                            2"); skip(1);
+    prouts("                              1"); skip(1);
+    if (Rand() < 0.15) {
+       prouts("GOODBYE-CRUEL-WORLD");
        skip(1);
-       scan();
-       chew();
-       if (strcmp(game.passwd, citem) != 0) {
-               prouts("PASSWORD-REJECTED;"); skip(1);
-               prouts("CONTINUITY-EFFECTED");
-               skip(2);
-               return;
-       }
-       prouts("PASSWORD-ACCEPTED"); skip(1);
-       prouts("                   5"); skip(1);
-       prouts("                      4"); skip(1);
-       prouts("                         3"); skip(1);
-       prouts("                            2"); skip(1);
-       prouts("                              1"); skip(1);
-       if (Rand() < 0.15) {
-               prouts("GOODBYE-CRUEL-WORLD");
-               skip(1);
-       }
-       kaboom();
+    }
+    kaboom();
 }
 
-void kaboom(void) {
-       stars();
-       if (ship==IHE) prouts("***");
-       prouts("********* Entropy of ");
-       crmshp();
-       prouts(" maximized *********");
-       skip(1);
-       stars();
-       skip(1);
-       if (nenhere != 0) {
-               double whammo = 25.0 * energy;
-               int l=1;
-               while (l <= nenhere) {
-                       if (game.kpower[l]*game.kdist[l] <= whammo) 
-                               deadkl(game.kx[l],game.ky[l], game.quad[game.kx[l]][game.ky[l]], game.kx[l], game.ky[l]);
-                       l++;
-               }
+void kaboom(void) 
+{
+    stars();
+    if (ship==IHE) prouts("***");
+    prouts("********* Entropy of ");
+    crmshp();
+    prouts(" maximized *********");
+    skip(1);
+    stars();
+    skip(1);
+    if (nenhere != 0) {
+       double whammo = 25.0 * energy;
+       int l=1;
+       while (l <= nenhere) {
+           if (game.kpower[l]*game.kdist[l] <= whammo) 
+               deadkl(game.kx[l],game.ky[l], game.quad[game.kx[l]][game.ky[l]], game.kx[l], game.ky[l]);
+           l++;
        }
-       finish(FDILITHIUM);
+    }
+    finish(FDILITHIUM);
 }
                                
 
-void finish(FINTYPE ifin) {
-       int igotit = 0;
-       alldone = 1;
-       skip(3);
-       prout("It is stardate %.1f.", game.state.date);
-        skip(1);
-       switch (ifin) {
-               case FWON: // Game has been won
-                       if (game.state.nromrem != 0)
-                               prout("The remaining %d Romulans surrender to Starfleet Command.",
-                                          game.state.nromrem);
+void finish(FINTYPE ifin) 
+{
+    int igotit = 0;
+    alldone = 1;
+    skip(3);
+    prout("It is stardate %.1f.", game.state.date);
+    skip(1);
+    switch (ifin) {
+    case FWON: // Game has been won
+       if (game.state.nromrem != 0)
+           prout("The remaining %d Romulans surrender to Starfleet Command.",
+                 game.state.nromrem);
 
-                       prout("You have smashed the Klingon invasion fleet and saved");
-                       prout("the Federation.");
-                       gamewon=1;
-                       if (alive) {
-                               double badpt;
-                               badpt = 5.*game.state.starkl + casual + 10.*game.state.nplankl +
-                                               45.*nhelp+100.*game.state.basekl;
-                               if (ship == IHF) badpt += 100.0;
-                               else if (ship == 0) badpt += 200.0;
-                               if (badpt < 100.0) badpt = 0.0; // Close enough!
-                               if (game.state.date-indate < 5.0 ||
-                                       // killsPerDate >= RateMax
-                                       (game.state.killk+game.state.killc+game.state.nsckill)/(game.state.date-indate) >=
-                                       0.1*skill*(skill+1.0) + 0.1 + 0.008*badpt) {
-                                       skip(1);
-                                       prout("In fact, you have done so well that Starfleet Command");
-                                       switch (skill) {
-                                               case 1:
-                                                       prout("promotes you one step in rank from \"Novice\" to \"Fair\".");
-                                                       break;
-                                               case 2:
-                                                       prout("promotes you one step in rank from \"Fair\" to \"Good\".");
-                                                       break;
-                                               case 3:
-                                                       prout("promotes you one step in rank from \"Good\" to \"Expert\".");
-                                                       break;
-                                               case 4:
-                                                       prout("promotes you to Commodore Emeritus.");
-                                                       skip(1);
-                                                       prout("Now that you think you're really good, try playing");
-                                                       prout("the \"Emeritus\" game. It will splatter your ego.");
-                                                       break;
-                                               case 5:
-                                                       skip(1);
-                                                        proutn("Computer-  ");
-                                                       prouts("ERROR-ERROR-ERROR-ERROR");
-                                                        skip(2);
-                                                        prouts("  YOUR-SKILL-HAS-EXCEEDED-THE-CAPACITY-OF-THIS-PROGRAM");
-                                                        skip(1);
-                                                        prouts("  THIS-PROGRAM-MUST-SURVIVE");
-                                                        skip(1);
-                                                        prouts("  THIS-PROGRAM-MUST-SURVIVE");
-                                                       skip(1);
-                                                        prouts("  THIS-PROGRAM-MUST-SURVIVE");
-                                                       skip(1);
-                                                        prouts("  THIS-PROGRAM-MUST?- MUST ? - SUR? ? -?  VI");
-                                                        skip(2);
-                                                       prout("Now you can retire and write your own Star Trek game!");
-                                                       skip(1);
-                                                       break;
-                                       }
-                                       if (skill > 3) {
-                                               if (thawed
+       prout("You have smashed the Klingon invasion fleet and saved");
+       prout("the Federation.");
+       gamewon=1;
+       if (alive) {
+           double badpt;
+           badpt = 5.0*game.state.starkl + casual + 10.0*game.state.nplankl +
+               45.*nhelp+100.*game.state.basekl;
+           if (ship == IHF) badpt += 100.0;
+           else if (ship == 0) badpt += 200.0;
+           if (badpt < 100.0) badpt = 0.0;     // Close enough!
+           if (game.state.date-indate < 5.0 ||
+               // killsPerDate >= RateMax
+               (game.state.killk+game.state.killc+game.state.nsckill)/(game.state.date-indate) >=
+               0.1*skill*(skill+1.0) + 0.1 + 0.008*badpt) {
+               skip(1);
+               prout("In fact, you have done so well that Starfleet Command");
+               switch (skill) {
+               case SKILL_NOVICE:
+                   prout("promotes you one step in rank from \"Novice\" to \"Fair\".");
+                   break;
+               case SKILL_FAIR:
+                   prout("promotes you one step in rank from \"Fair\" to \"Good\".");
+                   break;
+               case SKILL_GOOD:
+                   prout("promotes you one step in rank from \"Good\" to \"Expert\".");
+                   break;
+               case SKILL_EXPERT:
+                   prout("promotes you to Commodore Emeritus.");
+                   skip(1);
+                   prout("Now that you think you're really good, try playing");
+                   prout("the \"Emeritus\" game. It will splatter your ego.");
+                   break;
+               case SKILL_EMERITUS:
+                   skip(1);
+                   proutn("Computer-  ");
+                   prouts("ERROR-ERROR-ERROR-ERROR");
+                   skip(2);
+                   prouts("  YOUR-SKILL-HAS-EXCEEDED-THE-CAPACITY-OF-THIS-PROGRAM");
+                   skip(1);
+                   prouts("  THIS-PROGRAM-MUST-SURVIVE");
+                   skip(1);
+                   prouts("  THIS-PROGRAM-MUST-SURVIVE");
+                   skip(1);
+                   prouts("  THIS-PROGRAM-MUST-SURVIVE");
+                   skip(1);
+                   prouts("  THIS-PROGRAM-MUST?- MUST ? - SUR? ? -?  VI");
+                   skip(2);
+                   prout("Now you can retire and write your own Star Trek game!");
+                   skip(1);
+                   break;
+               }
+               if (skill >= SKILL_EXPERT) {
+                   if (thawed
 #ifdef DEBUG
-                                                       && !idebug
+                       && !idebug
 #endif
-                                                       )
-                                                       prout("You cannot get a citation, so...");
-                                               else {
-                                                       proutn("Do you want your Commodore Emeritus Citation printed? ");
-                                                       chew();
-                                                       if (ja()) {
-                                                               igotit = 1;
-                                                       }
-                                               }
-                                       }
-                               }
-                               // Only grant long life if alive (original didn't!)
-                               skip(1);
-                               prout("LIVE LONG AND PROSPER.");
+                       )
+                       prout("You cannot get a citation, so...");
+                   else {
+                       proutn("Do you want your Commodore Emeritus Citation printed? ");
+                       chew();
+                       if (ja()) {
+                           igotit = 1;
                        }
-                       score();
-                       if (igotit != 0) plaque();
-                       return;
-               case FDEPLETE: // Federation Resources Depleted
-                       prout("Your time has run out and the Federation has been");
-                       prout("conquered.  Your starship is now Klingon property,");
-                       prout("and you are put on trial as a war criminal.  On the");
-                       proutn("basis of your record, you are ");
-                       if (game.state.remkl*3.0 > inkling) {
-                               prout("aquitted.");
-                               skip(1);
-                               prout("LIVE LONG AND PROSPER.");
-                       }
-                       else {
-                               prout("found guilty and");
-                               prout("sentenced to death by slow torture.");
-                               alive = 0;
-                       }
-                       score();
-                       return;
-               case FLIFESUP:
-                       prout("Your life support reserves have run out, and");
-                       prout("you die of thirst, starvation, and asphyxiation.");
-                       prout("Your starship is a derelict in space.");
-                       break;
-               case FNRG:
-                       prout("Your energy supply is exhausted.");
-                       skip(1);
-                       prout("Your starship is a derelict in space.");
-                       break;
-               case FBATTLE:
-                       proutn("The ");
-                       crmshp();
-                       prout("has been destroyed in battle.");
-                       skip(1);
-                       prout("Dulce et decorum est pro patria mori.");
-                       break;
-               case FNEG3:
-                       prout("You have made three attempts to cross the negative energy");
-                       prout("barrier which surrounds the galaxy.");
-                       skip(1);
-                       prout("Your navigation is abominable.");
-                       score();
-                       return;
-               case FNOVA:
-                       prout("Your starship has been destroyed by a nova.");
-                       prout("That was a great shot.");
-                       skip(1);
-                       break;
-               case FSNOVAED:
-                       proutn("The ");
-                       crmshp();
-                       prout(" has been fried by a supernova.");
-                       prout("...Not even cinders remain...");
-                       break;
-               case FABANDN:
-                       prout("You have been captured by the Klingons. If you still");
-                       prout("had a starbase to be returned to, you would have been");
-                       prout("repatriated and given another chance. Since you have");
-                       prout("no starbases, you will be mercilessly tortured to death.");
-                       break;
-               case FDILITHIUM:
-                       prout("Your starship is now an expanding cloud of subatomic particles");
-                       break;
-               case FMATERIALIZE:
-                       prout("Starbase was unable to re-materialize your starship.");
-                       prout("Sic transit gloria muntdi");
-                       break;
-               case FPHASER:
-                       proutn("The ");
-                       crmshp();
-                       prout(" has been cremated by its own phasers.");
-                       break;
-               case FLOST:
-                       prout("You and your landing party have been");
-                       prout("converted to energy, disipating through space.");
-                       break;
-               case FMINING:
-                       prout("You are left with your landing party on");
-                       prout("a wild jungle planet inhabited by primitive cannibals.");
-                       skip(1);
-                       prout("They are very fond of \"Captain Kirk\" soup.");
-                       skip(1);
-                       proutn("Without your leadership, the ");
-                       crmshp();
-                       prout(" is destroyed.");
-                       break;
-               case FDPLANET:
-                       prout("You and your mining party perish.");
-                       skip(1);
-                       prout("That was a great shot.");
-                       skip(1);
-                       break;
-               case FSSC:
-                       prout("The Galileo is instantly annihilated by the supernova.");
-                       // no break;
-               case FPNOVA:
-                       prout("You and your mining party are atomized.");
-                       skip(1);
-                       proutn("Mr. Spock takes command of the ");
-                       crmshp();
-                       prout(" and");
-                       prout("joins the Romulans, reigning terror on the Federation.");
-                       break;
-               case FSTRACTOR:
-                       prout("The shuttle craft Galileo is also caught,");
-                       prout("and breaks up under the strain.");
-                       skip(1);
-                       prout("Your debris is scattered for millions of miles.");
-                       proutn("Without your leadership, the ");
-                       crmshp();
-                       prout(" is destroyed.");
-                       break;
-               case FDRAY:
-                       prout("The mutants attack and kill Spock.");
-                       prout("Your ship is captured by Klingons, and");
-                       prout("your crew is put on display in a Klingon zoo.");
-                       break;
-               case FTRIBBLE:
-                       prout("Tribbles consume all remaining water,");
-                       prout("food, and oxygen on your ship.");
-                       skip(1);
-                       prout("You die of thirst, starvation, and asphyxiation.");
-                       prout("Your starship is a derelict in space.");
-                       break;
-               case FHOLE:
-                       prout("Your ship is drawn to the center of the black hole.");
-                       prout("You are crushed into extremely dense matter.");
-                       break;
-       }
-       if (ship==IHF) ship= 0;
-       else if (ship == IHE) ship = IHF;
-       alive = 0;
-       if (game.state.remkl != 0) {
-               double goodies = game.state.remres/inresor;
-               double baddies = (game.state.remkl + 2.0*game.state.remcom)/(inkling+2.0*incom);
-               if (goodies/baddies >= 1.0+0.5*Rand()) {
-                       prout("As a result of your actions, a treaty with the Klingon");
-                       prout("Empire has been signed. The terms of the treaty are");
-                       if (goodies/baddies >= 3.0+Rand()) {
-                               prout("favorable to the Federation.");
-                               skip(1);
-                               prout("Congratulations!");
-                       }
-                       else
-                               prout("highly unfavorable to the Federation.");
+                   }
                }
-               else
-                       prout("The Federation will be destroyed.");
+           }
+           // Only grant long life if alive (original didn't!)
+           skip(1);
+           prout("LIVE LONG AND PROSPER.");
+       }
+       score();
+       if (igotit != 0) plaque();
+       return;
+    case FDEPLETE: // Federation Resources Depleted
+       prout("Your time has run out and the Federation has been");
+       prout("conquered.  Your starship is now Klingon property,");
+       prout("and you are put on trial as a war criminal.  On the");
+       proutn("basis of your record, you are ");
+       if (game.state.remkl*3.0 > inkling) {
+           prout("aquitted.");
+           skip(1);
+           prout("LIVE LONG AND PROSPER.");
        }
        else {
-               prout("Since you took the last Klingon with you, you are a");
-               prout("martyr and a hero. Someday maybe they'll erect a");
-               prout("statue in your memory. Rest in peace, and try not");
-               prout("to think about pigeons.");
-               gamewon = 1;
+           prout("found guilty and");
+           prout("sentenced to death by slow torture.");
+           alive = 0;
        }
        score();
+       return;
+    case FLIFESUP:
+       prout("Your life support reserves have run out, and");
+       prout("you die of thirst, starvation, and asphyxiation.");
+       prout("Your starship is a derelict in space.");
+       break;
+    case FNRG:
+       prout("Your energy supply is exhausted.");
+       skip(1);
+       prout("Your starship is a derelict in space.");
+       break;
+    case FBATTLE:
+       proutn("The ");
+       crmshp();
+       prout("has been destroyed in battle.");
+       skip(1);
+       prout("Dulce et decorum est pro patria mori.");
+       break;
+    case FNEG3:
+       prout("You have made three attempts to cross the negative energy");
+       prout("barrier which surrounds the galaxy.");
+       skip(1);
+       prout("Your navigation is abominable.");
+       score();
+       return;
+    case FNOVA:
+       prout("Your starship has been destroyed by a nova.");
+       prout("That was a great shot.");
+       skip(1);
+       break;
+    case FSNOVAED:
+       proutn("The ");
+       crmshp();
+       prout(" has been fried by a supernova.");
+       prout("...Not even cinders remain...");
+       break;
+    case FABANDN:
+       prout("You have been captured by the Klingons. If you still");
+       prout("had a starbase to be returned to, you would have been");
+       prout("repatriated and given another chance. Since you have");
+       prout("no starbases, you will be mercilessly tortured to death.");
+       break;
+    case FDILITHIUM:
+       prout("Your starship is now an expanding cloud of subatomic particles");
+       break;
+    case FMATERIALIZE:
+       prout("Starbase was unable to re-materialize your starship.");
+       prout("Sic transit gloria muntdi");
+       break;
+    case FPHASER:
+       proutn("The ");
+       crmshp();
+       prout(" has been cremated by its own phasers.");
+       break;
+    case FLOST:
+       prout("You and your landing party have been");
+       prout("converted to energy, disipating through space.");
+       break;
+    case FMINING:
+       prout("You are left with your landing party on");
+       prout("a wild jungle planet inhabited by primitive cannibals.");
+       skip(1);
+       prout("They are very fond of \"Captain Kirk\" soup.");
+       skip(1);
+       proutn("Without your leadership, the ");
+       crmshp();
+       prout(" is destroyed.");
+       break;
+    case FDPLANET:
+       prout("You and your mining party perish.");
+       skip(1);
+       prout("That was a great shot.");
+       skip(1);
+       break;
+    case FSSC:
+       prout("The Galileo is instantly annihilated by the supernova.");
+       // no break;
+    case FPNOVA:
+       prout("You and your mining party are atomized.");
+       skip(1);
+       proutn("Mr. Spock takes command of the ");
+       crmshp();
+       prout(" and");
+       prout("joins the Romulans, reigning terror on the Federation.");
+       break;
+    case FSTRACTOR:
+       prout("The shuttle craft Galileo is also caught,");
+       prout("and breaks up under the strain.");
+       skip(1);
+       prout("Your debris is scattered for millions of miles.");
+       proutn("Without your leadership, the ");
+       crmshp();
+       prout(" is destroyed.");
+       break;
+    case FDRAY:
+       prout("The mutants attack and kill Spock.");
+       prout("Your ship is captured by Klingons, and");
+       prout("your crew is put on display in a Klingon zoo.");
+       break;
+    case FTRIBBLE:
+       prout("Tribbles consume all remaining water,");
+       prout("food, and oxygen on your ship.");
+       skip(1);
+       prout("You die of thirst, starvation, and asphyxiation.");
+       prout("Your starship is a derelict in space.");
+       break;
+    case FHOLE:
+       prout("Your ship is drawn to the center of the black hole.");
+       prout("You are crushed into extremely dense matter.");
+       break;
+    }
+    if (ship==IHF) ship= 0;
+    else if (ship == IHE) ship = IHF;
+    alive = 0;
+    if (game.state.remkl != 0) {
+       double goodies = game.state.remres/inresor;
+       double baddies = (game.state.remkl + 2.0*game.state.remcom)/(inkling+2.0*incom);
+       if (goodies/baddies >= 1.0+0.5*Rand()) {
+           prout("As a result of your actions, a treaty with the Klingon");
+           prout("Empire has been signed. The terms of the treaty are");
+           if (goodies/baddies >= 3.0+Rand()) {
+               prout("favorable to the Federation.");
+               skip(1);
+               prout("Congratulations!");
+           }
+           else
+               prout("highly unfavorable to the Federation.");
+       }
+       else
+           prout("The Federation will be destroyed.");
+    }
+    else {
+       prout("Since you took the last Klingon with you, you are a");
+       prout("martyr and a hero. Someday maybe they'll erect a");
+       prout("statue in your memory. Rest in peace, and try not");
+       prout("to think about pigeons.");
+       gamewon = 1;
+    }
+    score();
 }
 
-void score(void) {
-       double timused = game.state.date - indate;
-       int ithperd, iwon, klship;
+void score(void) 
+{
+    double timused = game.state.date - indate;
+    int ithperd, iwon, klship;
 
-       iskill = skill;
-       if ((timused == 0 || game.state.remkl != 0) && timused < 5.0) timused = 5.0;
-       perdate = (game.state.killc + game.state.killk + game.state.nsckill)/timused;
-       ithperd = 500*perdate + 0.5;
-       iwon = 0;
-       if (gamewon) iwon = 100*skill;
-       if (ship == IHE) klship = 0;
-       else if (ship == IHF) klship = 1;
-       else klship = 2;
-       if (gamewon == 0) game.state.nromrem = 0; // None captured if no win
-       iscore = 10*game.state.killk + 50*game.state.killc + ithperd + iwon
-                        - 100*game.state.basekl - 100*klship - 45*nhelp -5*game.state.starkl - casual
-                        + 20*game.state.nromkl + 200*game.state.nsckill - 10*game.state.nplankl + game.state.nromrem;
-       if (alive == 0) iscore -= 200;
-       skip(2);
-       prout("Your score --");
-       if (game.state.nromkl)
-               prout("%6d Romulans destroyed                 %5d",
-                          game.state.nromkl,20*game.state.nromkl);
-       if (game.state.nromrem)
-               prout("%6d Romulans captured                  %5d",
-                          game.state.nromrem, game.state.nromrem);
-       if (game.state.killk)
-               prout("%6d ordinary Klingons destroyed        %5d",
-                          game.state.killk, 10*game.state.killk);
-       if (game.state.killc)
-               prout("%6d Klingon commanders destroyed       %5d",
-                          game.state.killc, 50*game.state.killc);
-       if (game.state.nsckill)
-               prout("%6d Super-Commander destroyed          %5d",
-                          game.state.nsckill, 200*game.state.nsckill);
-       if (ithperd)
-               prout("%6.2f Klingons per stardate              %5d",
-                          perdate, ithperd);
-       if (game.state.starkl)
-               prout("%6d stars destroyed by your action     %5d",
-                          game.state.starkl, -5*game.state.starkl);
-       if (game.state.nplankl)
-               prout("%6d planets destroyed by your action   %5d",
-                          game.state.nplankl, -10*game.state.nplankl);
-       if (game.state.basekl)
-               prout("%6d bases destroyed by your action     %5d",
-                          game.state.basekl, -100*game.state.basekl);
-       if (nhelp)
-               prout("%6d calls for help from starbase       %5d",
-                          nhelp, -45*nhelp);
-       if (casual)
-               prout("%6d casualties incurred                %5d",
-                          casual, -casual);
-       if (klship)
-               prout("%6d ship(s) lost or destroyed          %5d",
-                          klship, -100*klship);
-       if (alive==0)
-               prout("Penalty for getting yourself killed        -200");
-       if (gamewon) {
-               proutn("Bonus for winning ");
-               switch (skill) {
-                       case 1: proutn("Novice game  "); break;
-                       case 2: proutn("Fair game    "); break;
-                       case 3: proutn("Good game    "); break;
-                       case 4: proutn("Expert game  "); break;
-                       case 5: proutn("Emeritus game"); break;
-               }
-               prout("           %5d", iwon);
+    iskill = skill;
+    if ((timused == 0 || game.state.remkl != 0) && timused < 5.0) timused = 5.0;
+    perdate = (game.state.killc + game.state.killk + game.state.nsckill)/timused;
+    ithperd = 500*perdate + 0.5;
+    iwon = 0;
+    if (gamewon) iwon = 100*skill;
+    if (ship == IHE) klship = 0;
+    else if (ship == IHF) klship = 1;
+    else klship = 2;
+    if (gamewon == 0) game.state.nromrem = 0; // None captured if no win
+    iscore = 10*game.state.killk + 50*game.state.killc + ithperd + iwon
+       - 100*game.state.basekl - 100*klship - 45*nhelp -5*game.state.starkl - casual
+       + 20*game.state.nromkl + 200*game.state.nsckill - 10*game.state.nplankl + game.state.nromrem;
+    if (alive == 0) iscore -= 200;
+    skip(2);
+    prout("Your score --");
+    if (game.state.nromkl)
+       prout("%6d Romulans destroyed                 %5d",
+             game.state.nromkl,20*game.state.nromkl);
+    if (game.state.nromrem)
+       prout("%6d Romulans captured                  %5d",
+             game.state.nromrem, game.state.nromrem);
+    if (game.state.killk)
+       prout("%6d ordinary Klingons destroyed        %5d",
+             game.state.killk, 10*game.state.killk);
+    if (game.state.killc)
+       prout("%6d Klingon commanders destroyed       %5d",
+             game.state.killc, 50*game.state.killc);
+    if (game.state.nsckill)
+       prout("%6d Super-Commander destroyed          %5d",
+             game.state.nsckill, 200*game.state.nsckill);
+    if (ithperd)
+       prout("%6.2f Klingons per stardate              %5d",
+             perdate, ithperd);
+    if (game.state.starkl)
+       prout("%6d stars destroyed by your action     %5d",
+             game.state.starkl, -5*game.state.starkl);
+    if (game.state.nplankl)
+       prout("%6d planets destroyed by your action   %5d",
+             game.state.nplankl, -10*game.state.nplankl);
+    if (game.state.basekl)
+       prout("%6d bases destroyed by your action     %5d",
+             game.state.basekl, -100*game.state.basekl);
+    if (nhelp)
+       prout("%6d calls for help from starbase       %5d",
+             nhelp, -45*nhelp);
+    if (casual)
+       prout("%6d casualties incurred                %5d",
+             casual, -casual);
+    if (klship)
+       prout("%6d ship(s) lost or destroyed          %5d",
+             klship, -100*klship);
+    if (alive==0)
+       prout("Penalty for getting yourself killed        -200");
+    if (gamewon) {
+       proutn("Bonus for winning ");
+       switch (skill) {
+       case SKILL_NOVICE:   proutn("Novice game  "); break;
+       case SKILL_FAIR:     proutn("Fair game    "); break;
+       case SKILL_GOOD:     proutn("Good game    "); break;
+       case SKILL_EXPERT:   proutn("Expert game  "); break;
+       case SKILL_EMERITUS: proutn("Emeritus game"); break;
        }
-       skip(1);
-       prout("TOTAL SCORE                               %5d", iscore);
+       prout("           %5d", iwon);
+    }
+    skip(1);
+    prout("TOTAL SCORE                               %5d", iscore);
 }
 
 void plaque(void) {
@@ -435,8 +439,8 @@ void plaque(void) {
        fprintf(fp, "                                                       \"Commodore Emeritus\"\n\n");
        fprintf(fp, "                                                          ");
        switch (iskill) {
-               case 4: fprintf(fp," Expert level\n\n"); break;
-               case 5: fprintf(fp,"Emeritus level\n\n"); break;
+               case SKILL_EXPERT: fprintf(fp," Expert level\n\n"); break;
+               case SKILL_EMERITUS: fprintf(fp,"Emeritus level\n\n"); break;
                default: fprintf(fp," Cheat level\n\n"); break;
        }
        t = time(NULL);
diff --git a/io.c b/io.c
index e14e85366602af9408dd21f5a180a8fc40f00b75..fc173f7182c0baac431cdb9363a5279f6447ed68 100644 (file)
--- a/io.c
+++ b/io.c
@@ -82,13 +82,13 @@ void pause_game(int i)
     char *prompt;
     char buf[BUFSIZ];
     if (i==1) {
-       if (skill > 2)
+       if (skill > SKILL_FAIR)
            prompt = "[ANOUNCEMENT ARRIVING...]";
        else
            prompt = "[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]";
     }
     else {
-       if (skill > 2)
+       if (skill > SKILL_FAIR)
            prompt = "[CONTINUE?]";
        else
            prompt = "[PRESS ENTER TO CONTINUE]";
index d12c4abcd227e7a0b280982b443fc72cf60bc25a..0c91f71cd33886e3f907c6adfd1db0ae8a329091 100644 (file)
--- a/moving.c
+++ b/moving.c
 
 static void getcd(int, int);
 
-void imove(void) {
-       double angle, deltax, deltay, bigger, x, y,
+void imove(void) 
+{
+    double angle, deltax, deltay, bigger, x, y,
         finald, finalx, finaly, stopegy, probf;
-        int trbeam = 0, n, l, ix=0, iy=0, kink, kinks, iquad;
-
-       if (inorbit) {
-               prout("Helmsman Sulu- \"Leaving standard orbit.\"");
-               inorbit = 0;
-       }
-
-       angle = ((15.0 - direc) * 0.5235988);
-       deltax = -sin(angle);
-       deltay = cos(angle);
-       if (fabs(deltax) > fabs(deltay))
-               bigger = fabs(deltax);
-       else
-               bigger = fabs(deltay);
+    int trbeam = 0, n, l, ix=0, iy=0, kink, kinks, iquad;
+
+    if (inorbit) {
+       prout("Helmsman Sulu- \"Leaving standard orbit.\"");
+       inorbit = FALSE;
+    }
+
+    angle = ((15.0 - direc) * 0.5235988);
+    deltax = -sin(angle);
+    deltay = cos(angle);
+    if (fabs(deltax) > fabs(deltay))
+       bigger = fabs(deltax);
+    else
+       bigger = fabs(deltay);
                
-       deltay /= bigger;
-       deltax /= bigger;
-
-       /* If tractor beam is to occur, don't move full distance */
-       if (game.state.date+Time >= game.future[FTBEAM]) {
-               trbeam = 1;
-               condit = IHRED;
-               dist = dist*(game.future[FTBEAM]-game.state.date)/Time + 0.1;
-               Time = game.future[FTBEAM] - game.state.date + 1e-5;
-       }
-       /* Move within the quadrant */
-       game.quad[sectx][secty] = IHDOT;
-       x = sectx;
-       y = secty;
-       n = 10.0*dist*bigger+0.5;
-
-       if (n > 0) {
-               for (l = 1; l <= n; l++) {
-                       ix = (x += deltax) + 0.5;
-                       iy = (y += deltay) + 0.5;
-                       if (ix < 1 || ix > QUADSIZE || iy < 1 || iy > QUADSIZE) {
-                               /* Leaving quadrant -- allow final enemy attack */
-                               /* Don't do it if being pushed by Nova */
-                               if (nenhere != 0 && iattak != 2) {
-                                       newcnd();
-                                       for (l = 1; l <= nenhere; l++) {
-                                               finald = sqrt((ix-game.kx[l])*(double)(ix-game.kx[l]) +
-                                                                         (iy-game.ky[l])*(double)(iy-game.ky[l]));
-                                               game.kavgd[l] = 0.5 * (finald+game.kdist[l]);
-                                       }
-                                       /*
-                                        * Stas Sergeev added the condition
-                                        * that attacks only happen if Klingons
-                                        * are present and your skill is > 3.
-                                        */
-                                        if (skill > 3 && klhere > 0 && game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE)
-                                           attack(0);
-                                       if (alldone) return;
-                               }
-                               /* compute final position -- new quadrant and sector */
-                               x = QUADSIZE*(quadx-1)+sectx;
-                               y = QUADSIZE*(quady-1)+secty;
-                               ix = x+10.0*dist*bigger*deltax+0.5;
-                               iy = y+10.0*dist*bigger*deltay+0.5;
-                               /* check for edge of galaxy */
-                               kinks = 0;
-                               do {
-                                       kink = 0;
-                                       if (ix <= 0) {
-                                               ix = -ix + 1;
-                                               kink = 1;
-                                       }
-                                       if (iy <= 0) {
-                                               iy = -iy + 1;
-                                               kink = 1;
-                                       }
-                                       if (ix > GALSIZE*QUADSIZE) {
-                                               ix = 161 - ix;
-                                               kink = 1;
-                                       }
-                                       if (iy > GALSIZE*QUADSIZE) {
-                                               iy = 161 - iy;
-                                               kink = 1;
-                                       }
-                                       if (kink) kinks = 1;
-                               } while (kink);
-
-                               if (kinks) {
-                                       nkinks += 1;
-                                       if (nkinks == 3) {
-                                               /* Three strikes -- you're out! */
-                                               finish(FNEG3);
-                                               return;
-                                       }
-                                        prout("\n\rYOU HAVE ATTEMPTED TO CROSS THE NEGATIVE ENERGY BARRIER\n\r"
-                                                 "AT THE EDGE OF THE GALAXY.  THE THIRD TIME YOU TRY THIS,\n\r"
-                                                 "YOU WILL BE DESTROYED.\n\r");
-                               }
-                               /* Compute final position in new quadrant */
-                               if (trbeam) return; /* Don't bother if we are to be beamed */
-                               quadx = (ix+9)/QUADSIZE;
-                               quady = (iy+9)/QUADSIZE;
-                               sectx = ix - QUADSIZE*(quadx-1);
-                               secty = iy - QUADSIZE*(quady-1);
-                               prout("\n\rEntering %s.",
-                                     cramlc(quadrant, quadx, quady));
-                               game.quad[sectx][secty] = ship;
-                               newqad(0);
-                                if (skill>1) attack(0);
-                               return;
-                       }
-                       iquad = game.quad[ix][iy];
-                       if (iquad != IHDOT) {
-                               /* object encountered in flight path */
-                               stopegy = 50.0*dist/Time;
-                               dist=0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
-                                                         (secty-iy)*(double)(secty-iy));
-                               switch (iquad) {
-                                       case IHT: /* Ram a Tholian */
-                                       case IHK: /* Ram enemy ship */
-                                       case IHC:
-                                       case IHS:
-                                       case IHR:
-                                        case IHQUEST:
-                                               sectx = ix;
-                                               secty = iy;
-                                               ram(0, iquad, sectx, secty);
-                                               finalx = sectx;
-                                               finaly = secty;
-                                               break;
-                                       case IHBLANK:
-                                               skip(1);
-                                               prouts("***RED ALERT!  RED ALERT!");
-                                               skip(1);
-                                               proutn("***");
-                                               crmshp();
-                                               proutn(" pulled into black hole at ");
-                                               prout(cramlc(sector, ix, iy));
-                                               /*
-                                                * Getting pulled into a black 
-                                                * hole was certain death in
-                                                * Almy's original.  Stas 
-                                                * Sergeev added a possibility
-                                                * that you'll get timewarped
-                                                * instead.
-                                                */
-                                                n=0;
-                                                for (l=1;l<=NDEVICES+1;l++)
-                                                    if (game.damage[l]>0) n++;
-                                                probf=pow(1.4,(energy+shield)/5000.0-1.0)*
-                                                       pow(1.3,1.0/(n+1)-1.0);
-                                                if (Rand()>probf) 
-                                                   timwrp();
-                                                else 
-                                                   finish(FHOLE);
-                                               return;
-                                       default:
-                                               /* something else */
-                                               skip(1);
-                                               crmshp();
-                                               if (iquad == IHWEB)
-                                                       proutn(" encounters Tholian web at ");
-                                               else
-                                                       proutn(" blocked by object at ");
-                                               proutn(cramlc(sector, ix,iy));
-                                               prout(";");
-                                               proutn("Emergency stop required ");
-                                               prout("%2d units of energy.", (int)stopegy);
-                                               energy -= stopegy;
-                                               finalx = x-deltax+0.5;
-                                               sectx = finalx;
-                                               finaly = y-deltay+0.5;
-                                               secty = finaly;
-                                               if (energy <= 0) {
-                                                       finish(FNRG);
-                                                       return;
-                                               }
-                                               break;
-                               }
-                               goto label100;  /* sorry! */
-                       }
-               }
-               dist = 0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
-                                               (secty-iy)*(double)(secty-iy));
-               sectx = ix;
-               secty = iy;
-       }
-       finalx = sectx;
-       finaly = secty;
-label100:
-       /* No quadrant change -- compute new avg enemy distances */
-       game.quad[sectx][secty] = ship;
-       if (nenhere) {
-               for (l = 1; l <= nenhere; l++) {
+    deltay /= bigger;
+    deltax /= bigger;
+
+    /* If tractor beam is to occur, don't move full distance */
+    if (game.state.date+Time >= game.future[FTBEAM]) {
+       trbeam = 1;
+       condit = IHRED;
+       dist = dist*(game.future[FTBEAM]-game.state.date)/Time + 0.1;
+       Time = game.future[FTBEAM] - game.state.date + 1e-5;
+    }
+    /* Move within the quadrant */
+    game.quad[sectx][secty] = IHDOT;
+    x = sectx;
+    y = secty;
+    n = 10.0*dist*bigger+0.5;
+
+    if (n > 0) {
+       for (l = 1; l <= n; l++) {
+           ix = (x += deltax) + 0.5;
+           iy = (y += deltay) + 0.5;
+           if (ix < 1 || ix > QUADSIZE || iy < 1 || iy > QUADSIZE) {
+               /* Leaving quadrant -- allow final enemy attack */
+               /* Don't do it if being pushed by Nova */
+               if (nenhere != 0 && iattak != 2) {
+                   newcnd();
+                   for (l = 1; l <= nenhere; l++) {
                        finald = sqrt((ix-game.kx[l])*(double)(ix-game.kx[l]) +
-                                                 (iy-game.ky[l])*(double)(iy-game.ky[l]));
+                                     (iy-game.ky[l])*(double)(iy-game.ky[l]));
                        game.kavgd[l] = 0.5 * (finald+game.kdist[l]);
-                       game.kdist[l] = finald;
-               }
-               sortkl();
-               if (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE && iattak == 0)
+                   }
+                   /*
+                    * Stas Sergeev added the condition
+                    * that attacks only happen if Klingons
+                    * are present and your skill is good.
+                    */
+                   if (skill > SKILL_GOOD && klhere > 0 && game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE)
                        attack(0);
-               for (l = 1 ; l <= nenhere; l++) game.kavgd[l] = game.kdist[l];
-       }
-       newcnd();
-       iattak = 0;
-       drawmaps(0);
-       return;
+                   if (alldone) return;
+               }
+               /* compute final position -- new quadrant and sector */
+               x = QUADSIZE*(quadx-1)+sectx;
+               y = QUADSIZE*(quady-1)+secty;
+               ix = x+10.0*dist*bigger*deltax+0.5;
+               iy = y+10.0*dist*bigger*deltay+0.5;
+               /* check for edge of galaxy */
+               kinks = 0;
+               do {
+                   kink = 0;
+                   if (ix <= 0) {
+                       ix = -ix + 1;
+                       kink = 1;
+                   }
+                   if (iy <= 0) {
+                       iy = -iy + 1;
+                       kink = 1;
+                   }
+                   if (ix > GALSIZE*QUADSIZE) {
+                       ix = (GALSIZE*QUADSIZE*2)+1 - ix;
+                       kink = 1;
+                   }
+                   if (iy > GALSIZE*QUADSIZE) {
+                       iy = (GALSIZE*QUADSIZE*2)+1 - iy;
+                       kink = 1;
+                   }
+                   if (kink) kinks = 1;
+               } while (kink);
+
+               if (kinks) {
+                   nkinks += 1;
+                   if (nkinks == 3) {
+                       /* Three strikes -- you're out! */
+                       finish(FNEG3);
+                       return;
+                   }
+                   prout("\n\rYOU HAVE ATTEMPTED TO CROSS THE NEGATIVE ENERGY BARRIER\n\r"
+                         "AT THE EDGE OF THE GALAXY.  THE THIRD TIME YOU TRY THIS,\n\r"
+                         "YOU WILL BE DESTROYED.\n\r");
+               }
+               /* Compute final position in new quadrant */
+               if (trbeam) return; /* Don't bother if we are to be beamed */
+               quadx = (ix+(QUADSIZE-1))/QUADSIZE;
+               quady = (iy+(QUADSIZE-1))/QUADSIZE;
+               sectx = ix - QUADSIZE*(quadx-1);
+               secty = iy - QUADSIZE*(quady-1);
+               prout("\n\rEntering %s.",
+                     cramlc(quadrant, quadx, quady));
+               game.quad[sectx][secty] = ship;
+               newqad(0);
+               if (skill>SKILL_NOVICE) attack(0);
+               return;
+           }
+           iquad = game.quad[ix][iy];
+           if (iquad != IHDOT) {
+               /* object encountered in flight path */
+               stopegy = 50.0*dist/Time;
+               dist=0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
+                             (secty-iy)*(double)(secty-iy));
+               switch (iquad) {
+               case IHT: /* Ram a Tholian */
+               case IHK: /* Ram enemy ship */
+               case IHC:
+               case IHS:
+               case IHR:
+               case IHQUEST:
+                   sectx = ix;
+                   secty = iy;
+                   ram(0, iquad, sectx, secty);
+                   finalx = sectx;
+                   finaly = secty;
+                   break;
+               case IHBLANK:
+                   skip(1);
+                   prouts("***RED ALERT!  RED ALERT!");
+                   skip(1);
+                   proutn("***");
+                   crmshp();
+                   proutn(" pulled into black hole at ");
+                   prout(cramlc(sector, ix, iy));
+                   /*
+                    * Getting pulled into a black hole was certain
+                    * death in Almy's original.  Stas Sergeev added a
+                    * possibility that you'll get timewarped instead.
+                    */
+                   n=0;
+                   for (l=1;l<=NDEVICES+1;l++)
+                       if (game.damage[l]>0) n++;
+                   probf=pow(1.4,(energy+shield)/5000.0-1.0)*
+                       pow(1.3,1.0/(n+1)-1.0);
+                   if (Rand()>probf) 
+                       timwrp();
+                   else 
+                       finish(FHOLE);
+                   return;
+               default:
+                   /* something else */
+                   skip(1);
+                   crmshp();
+                   if (iquad == IHWEB)
+                       proutn(" encounters Tholian web at ");
+                   else
+                       proutn(" blocked by object at ");
+                   proutn(cramlc(sector, ix,iy));
+                   prout(";");
+                   proutn("Emergency stop required ");
+                   prout("%2d units of energy.", (int)stopegy);
+                   energy -= stopegy;
+                   finalx = x-deltax+0.5;
+                   sectx = finalx;
+                   finaly = y-deltay+0.5;
+                   secty = finaly;
+                   if (energy <= 0) {
+                       finish(FNRG);
+                       return;
+                   }
+                   break;
+               }
+               goto no_quad_change;    /* sorry! */
+           }
+       }
+       dist = 0.1*sqrt((sectx-ix)*(double)(sectx-ix) +
+                       (secty-iy)*(double)(secty-iy));
+       sectx = ix;
+       secty = iy;
+    }
+    finalx = sectx;
+    finaly = secty;
+no_quad_change:
+    /* No quadrant change -- compute new avg enemy distances */
+    game.quad[sectx][secty] = ship;
+    if (nenhere) {
+       for (l = 1; l <= nenhere; l++) {
+           finald = sqrt((ix-game.kx[l])*(double)(ix-game.kx[l]) +
+                         (iy-game.ky[l])*(double)(iy-game.ky[l]));
+           game.kavgd[l] = 0.5 * (finald+game.kdist[l]);
+           game.kdist[l] = finald;
+       }
+       sortkl();
+       if (game.state.galaxy[quadx][quady] != SUPERNOVA_PLACE && iattak == 0)
+           attack(0);
+       for (l = 1 ; l <= nenhere; l++) game.kavgd[l] = game.kdist[l];
+    }
+    newcnd();
+    iattak = 0;
+    drawmaps(0);
+    return;
 }
 
-void dock(int l) {
-       chew();
-        if (condit == IHDOCKED && l) {
-               prout("Already docked.");
-               return;
-       }
-       if (inorbit) {
-               prout("You must first leave standard orbit.");
-               return;
-       }
-       if (basex==0 || abs(sectx-basex) > 1 || abs(secty-basey) > 1) {
-               crmshp();
-               prout(" not adjacent to base.");
-               return;
-       }
-       condit = IHDOCKED;
-        if (l) prout("Docked.");
-        ididit=1;
-       if (energy < inenrg) energy = inenrg;
-       shield = inshld;
-       torps = intorps;
-       lsupres = inlsr;
-       if (stdamtim != 1e30 &&
-               (game.future[FCDBAS] < 1e30 || isatb == 1) && iseenit == 0) {
-               /* get attack report from base */
-               prout("Lt. Uhura- \"Captain, an important message from the starbase:\"");
-               attakreport(0);
-               iseenit = 1;
-       }
+void dock(int l) 
+{
+    chew();
+    if (condit == IHDOCKED && l) {
+       prout("Already docked.");
+       return;
+    }
+    if (inorbit) {
+       prout("You must first leave standard orbit.");
+       return;
+    }
+    if (basex==0 || abs(sectx-basex) > 1 || abs(secty-basey) > 1) {
+       crmshp();
+       prout(" not adjacent to base.");
+       return;
+    }
+    condit = IHDOCKED;
+    if (l) prout("Docked.");
+    ididit=1;
+    if (energy < inenrg) energy = inenrg;
+    shield = inshld;
+    torps = intorps;
+    lsupres = inlsr;
+    if (stdamtim != 1e30 &&
+       (game.future[FCDBAS] < 1e30 || isatb == 1) && iseenit == 0) {
+       /* get attack report from base */
+       prout("Lt. Uhura- \"Captain, an important message from the starbase:\"");
+       attakreport(0);
+       iseenit = 1;
+    }
 }
 
 static void getcd(int isprobe, int akey) {
@@ -430,573 +429,580 @@ static void getcd(int isprobe, int akey) {
                
 
 
-void impuls(void) {
-       double power;
+void impuls(void) 
+{
+    double power;
 
-       ididit = 0;
-       if (game.damage[DIMPULS]) {
-               chew();
-               skip(1);
-               prout("Engineer Scott- \"The impulse engines are damaged, Sir.\"");
-               return;
-       }
+    ididit = 0;
+    if (game.damage[DIMPULS]) {
+       chew();
+       skip(1);
+       prout("Engineer Scott- \"The impulse engines are damaged, Sir.\"");
+       return;
+    }
 
-       if (energy > 30.0) {
-               getcd(FALSE, 0);
-               if (direc == -1.0) return;
-               power = 20.0 + 100.0*dist;
-       }
-       else
-               power = 30.0;
+    if (energy > 30.0) {
+       getcd(FALSE, 0);
+       if (direc == -1.0) return;
+       power = 20.0 + 100.0*dist;
+    }
+    else
+       power = 30.0;
 
-       if (power >= energy) {
-               /* Insufficient power for trip */
-               skip(1);
-               prout("First Officer Spock- \"Captain, the impulse engines");
-               prout("require 20.0 units to engage, plus 100.0 units per");
-               if (energy > 30) {
-                       proutn("quadrant.  We can go, therefore, a maximum of %d", 
-                              (int)(0.01 * (energy-20.0)-0.05));
-                       prout(" quadrants.\"");
-               }
-               else {
-                       prout("quadrant.  They are, therefore, useless.\"");
-               }
-               chew();
-               return;
+    if (power >= energy) {
+       /* Insufficient power for trip */
+       skip(1);
+       prout("First Officer Spock- \"Captain, the impulse engines");
+       prout("require 20.0 units to engage, plus 100.0 units per");
+       if (energy > 30) {
+           proutn("quadrant.  We can go, therefore, a maximum of %d", 
+                  (int)(0.01 * (energy-20.0)-0.05));
+           prout(" quadrants.\"");
        }
-       /* Make sure enough time is left for the trip */
-       Time = dist/0.095;
-       if (Time >= game.state.remtime) {
-               prout("First Officer Spock- \"Captain, our speed under impulse");
-               prout("power is only 0.95 sectors per stardate. Are you sure");
-               proutn("we dare spend the time?\" ");
-               if (ja() == 0) return;
-       }
-       /* Activate impulse engines and pay the cost */
-       imove();
-       ididit = 1;
-       if (alldone) return;
-       power = 20.0 + 100.0*dist;
-       energy -= power;
-       Time = dist/0.095;
-       if (energy <= 0) finish(FNRG);
+       else {
+           prout("quadrant.  They are, therefore, useless.\"");
+       }
+       chew();
        return;
+    }
+    /* Make sure enough time is left for the trip */
+    Time = dist/0.095;
+    if (Time >= game.state.remtime) {
+       prout("First Officer Spock- \"Captain, our speed under impulse");
+       prout("power is only 0.95 sectors per stardate. Are you sure");
+       proutn("we dare spend the time?\" ");
+       if (ja() == 0) return;
+    }
+    /* Activate impulse engines and pay the cost */
+    imove();
+    ididit = 1;
+    if (alldone) return;
+    power = 20.0 + 100.0*dist;
+    energy -= power;
+    Time = dist/0.095;
+    if (energy <= 0) finish(FNRG);
+    return;
 }
 
 
-void warp(int i) {
-       int blooey=0, twarp=0, iwarp;
-       double power;
+void warp(int i) 
+{
+    int blooey=0, twarp=0, iwarp;
+    double power;
 
-       if (i!=2) { /* Not WARPX entry */
-               ididit = 0;
-               if (game.damage[DWARPEN] > 10.0) {
-                       chew();
-                       skip(1);
-                       prout("Engineer Scott- \"The impulse engines are damaged, Sir.\"");
-                       return;
-               }
-               if (game.damage[DWARPEN] > 0.0 && warpfac > 4.0) {
-                       chew();
-                       skip(1);
-                       prout("Engineer Scott- \"Sorry, Captain. Until this damage");
-                       prout("  is repaired, I can only give you warp 4.\"");
-                       return;
-               }
+    if (i!=2) { /* Not WARPX entry */
+       ididit = 0;
+       if (game.damage[DWARPEN] > 10.0) {
+           chew();
+           skip(1);
+           prout("Engineer Scott- \"The impulse engines are damaged, Sir.\"");
+           return;
+       }
+       if (game.damage[DWARPEN] > 0.0 && warpfac > 4.0) {
+           chew();
+           skip(1);
+           prout("Engineer Scott- \"Sorry, Captain. Until this damage");
+           prout("  is repaired, I can only give you warp 4.\"");
+           return;
+       }
                        
-               /* Read in course and distance */
-               getcd(FALSE, 0);
-               if (direc == -1.0) return;
-
-               /* Make sure starship has enough energy for the trip */
-               power = (dist+0.05)*warpfac*warpfac*warpfac*(shldup+1);
-
-
-               if (power >= energy) {
-                       /* Insufficient power for trip */
-                       ididit = 0;
-                       skip(1);
-                       prout("Engineering to bridge--");
-                       if (shldup==0 || 0.5*power > energy) {
-                               iwarp = pow((energy/(dist+0.05)), 0.333333333);
-                               if (iwarp <= 0) {
-                                       prout("We can't do it, Captain. We haven't the energy.");
-                               }
-                               else {
-                                       proutn("We haven't the energy, but we could do it at warp %d", iwarp);
-                                       if (shldup) {
-                                               prout(",");
-                                               prout("if you'll lower the shields.");
-                                       }
-                                       else
-                                               prout(".");
-                               }
-                       }
-                       else
-                               prout("We haven't the energy to go that far with the shields up.");
-                       return;
-               }
-                                               
-               /* Make sure enough time is left for the trip */
-               Time = 10.0*dist/wfacsq;
-               if (Time >= 0.8*game.state.remtime) {
-                       skip(1);
-                       prout("First Officer Spock- \"Captain, I compute that such");
-                       proutn("  a trip would require approximately %2.0f",
-                               100.0*Time/game.state.remtime);
-                       prout(" percent of our");
-                        proutn("  remaining time.  Are you sure this is wise?\" ");
-                        if (ja() == 0) { ididit = 0; Time=0; return;}
+       /* Read in course and distance */
+       getcd(FALSE, 0);
+       if (direc == -1.0) return;
+
+       /* Make sure starship has enough energy for the trip */
+       power = (dist+0.05)*warpfac*warpfac*warpfac*(shldup+1);
+
+
+       if (power >= energy) {
+           /* Insufficient power for trip */
+           ididit = 0;
+           skip(1);
+           prout("Engineering to bridge--");
+           if (shldup==0 || 0.5*power > energy) {
+               iwarp = pow((energy/(dist+0.05)), 0.333333333);
+               if (iwarp <= 0) {
+                   prout("We can't do it, Captain. We haven't the energy.");
                }
+               else {
+                   proutn("We haven't the energy, but we could do it at warp %d", iwarp);
+                   if (shldup) {
+                       prout(",");
+                       prout("if you'll lower the shields.");
+                   }
+                   else
+                       prout(".");
+               }
+           }
+           else
+               prout("We haven't the energy to go that far with the shields up.");
+           return;
        }
-       /* Entry WARPX */
-       if (warpfac > 6.0) {
-               /* Decide if engine damage will occur */
-               double prob = dist*(6.0-warpfac)*(6.0-warpfac)/66.666666666;
-               if (prob > Rand()) {
-                       blooey = 1;
-                       dist = Rand()*dist;
-               }
-               /* Decide if time warp will occur */
-               if (0.5*dist*pow(7.0,warpfac-10.0) > Rand()) twarp=1;
+                                               
+       /* Make sure enough time is left for the trip */
+       Time = 10.0*dist/wfacsq;
+       if (Time >= 0.8*game.state.remtime) {
+           skip(1);
+           prout("First Officer Spock- \"Captain, I compute that such");
+           proutn("  a trip would require approximately %2.0f",
+                  100.0*Time/game.state.remtime);
+           prout(" percent of our");
+           proutn("  remaining time.  Are you sure this is wise?\" ");
+           if (ja() == 0) { ididit = 0; Time=0; return;}
+       }
+    }
+    /* Entry WARPX */
+    if (warpfac > 6.0) {
+       /* Decide if engine damage will occur */
+       double prob = dist*(6.0-warpfac)*(6.0-warpfac)/66.666666666;
+       if (prob > Rand()) {
+           blooey = 1;
+           dist = Rand()*dist;
+       }
+       /* Decide if time warp will occur */
+       if (0.5*dist*pow(7.0,warpfac-10.0) > Rand()) twarp=1;
 #ifdef DEBUG
-               if (idebug &&warpfac==10 && twarp==0) {
-                       blooey=0;
-                       proutn("Force time warp? ");
-                       if (ja()==1) twarp=1;
-               }
+       if (idebug &&warpfac==10 && twarp==0) {
+           blooey=0;
+           proutn("Force time warp? ");
+           if (ja()==1) twarp=1;
+       }
 #endif
-               if (blooey || twarp) {
-                       /* If time warp or engine damage, check path */
-                       /* If it is obstructed, don't do warp or damage */
-                       double angle = ((15.0-direc)*0.5235998);
-                       double deltax = -sin(angle);
-                       double deltay = cos(angle);
-                       double bigger, x, y;
-                       int n, l, ix, iy;
-                       if (fabs(deltax) > fabs(deltay))
-                               bigger = fabs(deltax);
-                       else
-                               bigger = fabs(deltay);
+       if (blooey || twarp) {
+           /* If time warp or engine damage, check path */
+           /* If it is obstructed, don't do warp or damage */
+           double angle = ((15.0-direc)*0.5235998);
+           double deltax = -sin(angle);
+           double deltay = cos(angle);
+           double bigger, x, y;
+           int n, l, ix, iy;
+           if (fabs(deltax) > fabs(deltay))
+               bigger = fabs(deltax);
+           else
+               bigger = fabs(deltay);
                        
-                       deltax /= bigger;
-                       deltay /= bigger;
-                       n = 10.0 * dist * bigger +0.5;
-                       x = sectx;
-                       y = secty;
-                       for (l = 1; l <= n; l++) {
-                               x += deltax;
-                               ix = x + 0.5;
-                               if (ix < 1 || ix > QUADSIZE) break;
-                               y += deltay;
-                               iy = y +0.5;
-                               if (iy < 1 || iy > QUADSIZE) break;
-                               if (game.quad[ix][iy] != IHDOT) {
-                                       blooey = 0;
-                                       twarp = 0;
-                               }
-                       }
-               }
-       }
+           deltax /= bigger;
+           deltay /= bigger;
+           n = 10.0 * dist * bigger +0.5;
+           x = sectx;
+           y = secty;
+           for (l = 1; l <= n; l++) {
+               x += deltax;
+               ix = x + 0.5;
+               if (ix < 1 || ix > QUADSIZE) break;
+               y += deltay;
+               iy = y +0.5;
+               if (iy < 1 || iy > QUADSIZE) break;
+               if (game.quad[ix][iy] != IHDOT) {
+                   blooey = 0;
+                   twarp = 0;
+               }
+           }
+       }
+    }
                                
 
-       /* Activate Warp Engines and pay the cost */
-       imove();
-       if (alldone) return;
-       energy -= dist*warpfac*warpfac*warpfac*(shldup+1);
-       if (energy <= 0) finish(FNRG);
-       Time = 10.0*dist/wfacsq;
-       if (twarp) timwrp();
-       if (blooey) {
-               game.damage[DWARPEN] = damfac*(3.0*Rand()+1.0);
-               skip(1);
-               prout("Engineering to bridge--");
-               prout("  Scott here.  The warp engines are damaged.");
-               prout("  We'll have to reduce speed to warp 4.");
-       }
-       ididit = 1;
-       return;
+    /* Activate Warp Engines and pay the cost */
+    imove();
+    if (alldone) return;
+    energy -= dist*warpfac*warpfac*warpfac*(shldup+1);
+    if (energy <= 0) finish(FNRG);
+    Time = 10.0*dist/wfacsq;
+    if (twarp) timwrp();
+    if (blooey) {
+       game.damage[DWARPEN] = damfac*(3.0*Rand()+1.0);
+       skip(1);
+       prout("Engineering to bridge--");
+       prout("  Scott here.  The warp engines are damaged.");
+       prout("  We'll have to reduce speed to warp 4.");
+    }
+    ididit = 1;
+    return;
 }
 
 
 
-void setwrp(void) {
-       int key;
-       double oldfac;
+void setwrp(void) 
+{
+    int key;
+    double oldfac;
        
-       while ((key=scan()) == IHEOL) {
-               chew();
-               proutn("Warp factor- ");
-       }
+    while ((key=scan()) == IHEOL) {
        chew();
-       if (key != IHREAL) {
-               huh();
-               return;
-       }
-       if (game.damage[DWARPEN] > 10.0) {
-               prout("Warp engines inoperative.");
-               return;
-       }
-       if (game.damage[DWARPEN] > 0.0 && aaitem > 4.0) {
-               prout("Engineer Scott- \"I'm doing my best, Captain,\n"
-                         "  but right now we can only go warp 4.\"");
-               return;
-       }
-       if (aaitem > 10.0) {
-               prout("Helmsman Sulu- \"Our top speed is warp 10, Captain.\"");
-               return;
-       }
-       if (aaitem < 1.0) {
-               prout("Helmsman Sulu- \"We can't go below warp 1, Captain.\"");
-               return;
-       }
-       oldfac = warpfac;
-       warpfac = aaitem;
-       wfacsq=warpfac*warpfac;
-       if (warpfac <= oldfac || warpfac <= 6.0) {
-               proutn("Helmsman Sulu- \"Warp factor %d, Captain.\"", 
-                       (int)warpfac);
-               return;
-       }
-       if (warpfac < 8.00) {
-               prout("Engineer Scott- \"Aye, but our maximum safe speed is warp 6.\"");
-               return;
-       }
-       if (warpfac == 10.0) {
-               prout("Engineer Scott- \"Aye, Captain, we'll try it.\"");
-               return;
-       }
-       prout("Engineer Scott- \"Aye, Captain, but our engines may not take it.\"");
+       proutn("Warp factor- ");
+    }
+    chew();
+    if (key != IHREAL) {
+       huh();
+       return;
+    }
+    if (game.damage[DWARPEN] > 10.0) {
+       prout("Warp engines inoperative.");
+       return;
+    }
+    if (game.damage[DWARPEN] > 0.0 && aaitem > 4.0) {
+       prout("Engineer Scott- \"I'm doing my best, Captain,\n"
+             "  but right now we can only go warp 4.\"");
+       return;
+    }
+    if (aaitem > 10.0) {
+       prout("Helmsman Sulu- \"Our top speed is warp 10, Captain.\"");
+       return;
+    }
+    if (aaitem < 1.0) {
+       prout("Helmsman Sulu- \"We can't go below warp 1, Captain.\"");
+       return;
+    }
+    oldfac = warpfac;
+    warpfac = aaitem;
+    wfacsq=warpfac*warpfac;
+    if (warpfac <= oldfac || warpfac <= 6.0) {
+       proutn("Helmsman Sulu- \"Warp factor %d, Captain.\"", 
+              (int)warpfac);
        return;
+    }
+    if (warpfac < 8.00) {
+       prout("Engineer Scott- \"Aye, but our maximum safe speed is warp 6.\"");
+       return;
+    }
+    if (warpfac == 10.0) {
+       prout("Engineer Scott- \"Aye, Captain, we'll try it.\"");
+       return;
+    }
+    prout("Engineer Scott- \"Aye, Captain, but our engines may not take it.\"");
+    return;
 }
 
-void atover(int igrab) {
-       double power, distreq;
-
-       chew();
-       /* is captain on planet? */
-       if (landed==1) {
-               if (game.damage[DTRANSP]) {
-                       finish(FPNOVA);
-                       return;
-               }
-               prout("Scotty rushes to the transporter controls.");
-               if (shldup) {
-                       prout("But with the shields up it's hopeless.");
-                       finish(FPNOVA);
-               }
-               prouts("His desperate attempt to rescue you . . .");
-               if (Rand() <= 0.5) {
-                       prout("fails.");
-                       finish(FPNOVA);
-                       return;
-               }
-               prout("SUCCEEDS!");
-               if (imine) {
-                       imine = 0;
-                       proutn("The crystals mined were ");
-                       if (Rand() <= 0.25) {
-                               prout("lost.");
-                       }
-                       else {
-                               prout("saved.");
-                               icrystl = 1;
-                       }
-               }
-       }
-       if (igrab) return;
-
-       /* Check to see if captain in shuttle craft */
-       if (icraft) finish(FSTRACTOR);
-       if (alldone) return;
-
-       /* Inform captain of attempt to reach safety */
+void atover(int igrab) 
+{
+    double power, distreq;
+
+    chew();
+    /* is captain on planet? */
+    if (landed==1) {
+       if (game.damage[DTRANSP]) {
+           finish(FPNOVA);
+           return;
+       }
+       prout("Scotty rushes to the transporter controls.");
+       if (shldup) {
+           prout("But with the shields up it's hopeless.");
+           finish(FPNOVA);
+       }
+       prouts("His desperate attempt to rescue you . . .");
+       if (Rand() <= 0.5) {
+           prout("fails.");
+           finish(FPNOVA);
+           return;
+       }
+       prout("SUCCEEDS!");
+       if (imine) {
+           imine = 0;
+           proutn("The crystals mined were ");
+           if (Rand() <= 0.25) {
+               prout("lost.");
+           }
+           else {
+               prout("saved.");
+               icrystl = 1;
+           }
+       }
+    }
+    if (igrab) return;
+
+    /* Check to see if captain in shuttle craft */
+    if (icraft) finish(FSTRACTOR);
+    if (alldone) return;
+
+    /* Inform captain of attempt to reach safety */
+    skip(1);
+    do {
+       if (justin) {
+           prouts("***RED ALERT!  READ ALERT!");
+           skip(1);
+           proutn("The ");
+           crmshp();
+           prout(" has stopped in a quadrant containing");
+           prouts("   a supernova.");
+           skip(2);
+       }
+       proutn("***Emergency automatic override attempts to hurl ");
+       crmshp();
        skip(1);
-       do {
-               if (justin) {
-                       prouts("***RED ALERT!  READ ALERT!");
-                       skip(1);
-                       proutn("The ");
-                       crmshp();
-                       prout(" has stopped in a quadrant containing");
-                       prouts("   a supernova.");
-                       skip(2);
-               }
-               proutn("***Emergency automatic override attempts to hurl ");
-               crmshp();
-               skip(1);
-               prout("safely out of quadrant.");
-               game.starch[quadx][quady] = game.damage[DRADIO] > 0.0 ? game.state.galaxy[quadx][quady]+SUPERNOVA_PLACE:1;
-
-               /* Try to use warp engines */
-               if (game.damage[DWARPEN]) {
-                       skip(1);
-                       prout("Warp engines damaged.");
-                       finish(FSNOVAED);
-                       return;
-               }
-               warpfac = 6.0+2.0*Rand();
-               wfacsq = warpfac * warpfac;
-               prout("Warp factor set to %d", (int)warpfac);
-               power = 0.75*energy;
-               dist = power/(warpfac*warpfac*warpfac*(shldup+1));
-               distreq = 1.4142+Rand();
-               if (distreq < dist) dist = distreq;
-               Time = 10.0*dist/wfacsq;
-               direc = 12.0*Rand();    /* How dumb! */
-               justin = 0;
-               inorbit = 0;
-               warp(2);
-               if (justin == 0) {
-                       /* This is bad news, we didn't leave quadrant. */
-                       if (alldone) return;
-                       skip(1);
-                       prout("Insufficient energy to leave quadrant.");
-                       finish(FSNOVAED);
-                       return;
-               }
-               /* Repeat if another snova */
-       } while (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE);
-       if (game.state.remkl==0) finish(FWON); /* Snova killed remaining enemy. */
+       prout("safely out of quadrant.");
+       game.starch[quadx][quady] = game.damage[DRADIO] > 0.0 ? game.state.galaxy[quadx][quady]+SUPERNOVA_PLACE:1;
+
+       /* Try to use warp engines */
+       if (game.damage[DWARPEN]) {
+           skip(1);
+           prout("Warp engines damaged.");
+           finish(FSNOVAED);
+           return;
+       }
+       warpfac = 6.0+2.0*Rand();
+       wfacsq = warpfac * warpfac;
+       prout("Warp factor set to %d", (int)warpfac);
+       power = 0.75*energy;
+       dist = power/(warpfac*warpfac*warpfac*(shldup+1));
+       distreq = 1.4142+Rand();
+       if (distreq < dist) dist = distreq;
+       Time = 10.0*dist/wfacsq;
+       direc = 12.0*Rand();    /* How dumb! */
+       justin = 0;
+       inorbit = 0;
+       warp(2);
+       if (justin == 0) {
+           /* This is bad news, we didn't leave quadrant. */
+           if (alldone) return;
+           skip(1);
+           prout("Insufficient energy to leave quadrant.");
+           finish(FSNOVAED);
+           return;
+       }
+       /* Repeat if another snova */
+    } while (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE);
+    if (game.state.remkl==0) finish(FWON); /* Snova killed remaining enemy. */
 }
 
-void timwrp() {
-       int l, ll, gotit;
-       prout("***TIME WARP ENTERED.");
-       if (game.state.snap && Rand() < 0.5) {
-               /* Go back in time */
-               prout("You are traveling backwards in time %d stardates.",
-                     (int)(game.state.date-game.snapsht.date));
-               game.state = game.snapsht;
-               game.state.snap = 0;
-               if (game.state.remcom) {
-                       game.future[FTBEAM] = game.state.date + expran(intime/game.state.remcom);
-                       game.future[FBATTAK] = game.state.date + expran(0.3*intime);
-               }
-               game.future[FSNOVA] = game.state.date + expran(0.5*intime);
-               game.future[FSNAP] = game.state.date +expran(0.25*game.state.remtime); /* next snapshot will
-                                                                                                          be sooner */
-               if (game.state.nscrem) game.future[FSCMOVE] = 0.2777;
-               isatb = 0;
-               game.future[FCDBAS] = game.future[FSCDBAS] = 1e30;
-               batx = baty = 0;
-
-               /* Make sure Galileo is consistant -- Snapshot may have been taken
-                  when on planet, which would give us two Galileos! */
-               gotit = 0;
-               for (l = 0; l < inplan; l++) {
-                       if (game.state.plnets[l].known == shuttle_down) {
-                               gotit = 1;
-                               if (iscraft==1 && ship==IHE) {
-                                       prout("Checkov-  \"Security reports the Galileo has disappeared, Sir!");
-                                       iscraft = 0;
-                               }
-                       }
-               }
-               /* Likewise, if in the original time the Galileo was abandoned, but
-                  was on ship earlier, it would have vanished -- lets restore it */
-               if (iscraft==0 && gotit==0 && game.damage[DSHUTTL] >= 0.0) {
-                       prout("Checkov-  \"Security reports the Galileo has reappeared in the dock!\"");
-                       iscraft = 1;
-               }
-
-               /* Revert star chart to earlier era, if it was known then*/
-               if (game.damage[DRADIO]==0.0 || stdamtim > game.state.date) {
-                       for (l = 1; l <= GALSIZE; l++)
-                               for (ll = 1; ll <= GALSIZE; ll++)
-                                       if (game.starch[l][ll] > 1)
-                                               game.starch[l][ll]=game.damage[DRADIO]>0.0 ? game.state.galaxy[l][ll]+SUPERNOVA_PLACE :1;
-                       prout("Spock has reconstructed a correct star chart from memory");
-                       if (game.damage[DRADIO] > 0.0) stdamtim = game.state.date;
-               }
-       }
-       else {
-               /* Go forward in time */
-               Time = -0.5*intime*log(Rand());
-               prout("You are traveling forward in time %d stardates.", (int)Time);
-               /* cheat to make sure no tractor beams occur during time warp */
-               game.future[FTBEAM] += Time;
-               game.damage[DRADIO] += Time;
-       }
-       newqad(0);
-        events();      /* Stas Sergeev added this -- do pending events */
+void timwrp() 
+{
+    int l, ll, gotit;
+    prout("***TIME WARP ENTERED.");
+    if (game.state.snap && Rand() < 0.5) {
+       /* Go back in time */
+       prout("You are traveling backwards in time %d stardates.",
+             (int)(game.state.date-game.snapsht.date));
+       game.state = game.snapsht;
+       game.state.snap = 0;
+       if (game.state.remcom) {
+           game.future[FTBEAM] = game.state.date + expran(intime/game.state.remcom);
+           game.future[FBATTAK] = game.state.date + expran(0.3*intime);
+       }
+       game.future[FSNOVA] = game.state.date + expran(0.5*intime);
+       game.future[FSNAP] = game.state.date +expran(0.25*game.state.remtime); /* next snapshot will
+                                                                                 be sooner */
+       if (game.state.nscrem) game.future[FSCMOVE] = 0.2777;
+       isatb = 0;
+       game.future[FCDBAS] = game.future[FSCDBAS] = 1e30;
+       batx = baty = 0;
+
+       /* Make sure Galileo is consistant -- Snapshot may have been taken
+          when on planet, which would give us two Galileos! */
+       gotit = 0;
+       for (l = 0; l < inplan; l++) {
+           if (game.state.plnets[l].known == shuttle_down) {
+               gotit = 1;
+               if (iscraft==1 && ship==IHE) {
+                   prout("Checkov-  \"Security reports the Galileo has disappeared, Sir!");
+                   iscraft = 0;
+               }
+           }
+       }
+       /* Likewise, if in the original time the Galileo was abandoned, but
+          was on ship earlier, it would have vanished -- lets restore it */
+       if (iscraft==0 && gotit==0 && game.damage[DSHUTTL] >= 0.0) {
+           prout("Checkov-  \"Security reports the Galileo has reappeared in the dock!\"");
+           iscraft = 1;
+       }
+
+       /* Revert star chart to earlier era, if it was known then*/
+       if (game.damage[DRADIO]==0.0 || stdamtim > game.state.date) {
+           for (l = 1; l <= GALSIZE; l++)
+               for (ll = 1; ll <= GALSIZE; ll++)
+                   if (game.starch[l][ll] > 1)
+                       game.starch[l][ll]=game.damage[DRADIO]>0.0 ? game.state.galaxy[l][ll]+SUPERNOVA_PLACE :1;
+           prout("Spock has reconstructed a correct star chart from memory");
+           if (game.damage[DRADIO] > 0.0) stdamtim = game.state.date;
+       }
+    }
+    else {
+       /* Go forward in time */
+       Time = -0.5*intime*log(Rand());
+       prout("You are traveling forward in time %d stardates.", (int)Time);
+       /* cheat to make sure no tractor beams occur during time warp */
+       game.future[FTBEAM] += Time;
+       game.damage[DRADIO] += Time;
+    }
+    newqad(0);
+    events();  /* Stas Sergeev added this -- do pending events */
 }
 
-void probe(void) {
-       double angle, bigger;
-       int key;
-       /* New code to launch a deep space probe */
-       if (nprobes == 0) {
-               chew();
-               skip(1);
-               if (ship == IHE) 
-                       prout("Engineer Scott- \"We have no more deep space probes, Sir.\"");
-               else
-                       prout("Ye Faerie Queene has no deep space probes.");
-               return;
-       }
-       if (game.damage[DDSP] != 0.0) {
-               chew();
-               skip(1);
-               prout("Engineer Scott- \"The probe launcher is damaged, Sir.\"");
-               return;
-       }
-       if (game.future[FDSPROB] != 1e30) {
-               chew();
-               skip(1);
-               if (game.damage[DRADIO] != 0 && condit != IHDOCKED) {
-                       prout("Spock-  \"Records show the previous probe has not yet");
-                       prout("   reached its destination.\"");
-               }
-               else
-                       prout("Uhura- \"The previous probe is still reporting data, Sir.\"");
-               return;
-       }
-       key = scan();
-
-       if (key == IHEOL) {
-               /* slow mode, so let Kirk know how many probes there are left */
-               prout(nprobes==1 ? "%d probe left." : "%d probes left.", nprobes);
-               proutn("Are you sure you want to fire a probe? ");
-               if (ja()==0) return;
-       }
-
-       isarmed = FALSE;
-       if (key == IHALPHA && strcmp(citem,"armed") == 0) {
-               isarmed = TRUE;
-               key = scan();
-       }
-       else if (key == IHEOL) {
-               proutn("Arm NOVAMAX warhead? ");
-               isarmed = ja();
+void probe(void) 
+{
+    double angle, bigger;
+    int key;
+    /* New code to launch a deep space probe */
+    if (nprobes == 0) {
+       chew();
+       skip(1);
+       if (ship == IHE) 
+           prout("Engineer Scott- \"We have no more deep space probes, Sir.\"");
+       else
+           prout("Ye Faerie Queene has no deep space probes.");
+       return;
+    }
+    if (game.damage[DDSP] != 0.0) {
+       chew();
+       skip(1);
+       prout("Engineer Scott- \"The probe launcher is damaged, Sir.\"");
+       return;
+    }
+    if (game.future[FDSPROB] != 1e30) {
+       chew();
+       skip(1);
+       if (game.damage[DRADIO] != 0 && condit != IHDOCKED) {
+           prout("Spock-  \"Records show the previous probe has not yet");
+           prout("   reached its destination.\"");
        }
-       getcd(TRUE, key);
-       if (direc == -1.0) return;
-       nprobes--;
-               angle = ((15.0 - direc) * 0.5235988);
-       probeinx = -sin(angle);
-       probeiny = cos(angle);
-       if (fabs(probeinx) > fabs(probeiny))
-               bigger = fabs(probeinx);
        else
-               bigger = fabs(probeiny);
-               
-       probeiny /= bigger;
-       probeinx /= bigger;
-       proben = 10.0*dist*bigger +0.5;
-       probex = quadx*QUADSIZE + sectx - 1;    // We will use better packing than original
-       probey = quady*QUADSIZE + secty - 1;
-       probecx = quadx;
-       probecy = quady;
-       game.future[FDSPROB] = game.state.date + 0.01; // Time to move one sector
-       prout("Ensign Chekov-  \"The deep space probe is launched, Captain.\"");
-       ididit = 1;
+           prout("Uhura- \"The previous probe is still reporting data, Sir.\"");
        return;
+    }
+    key = scan();
+
+    if (key == IHEOL) {
+       /* slow mode, so let Kirk know how many probes there are left */
+       prout(nprobes==1 ? "%d probe left." : "%d probes left.", nprobes);
+       proutn("Are you sure you want to fire a probe? ");
+       if (ja()==0) return;
+    }
+
+    isarmed = FALSE;
+    if (key == IHALPHA && strcmp(citem,"armed") == 0) {
+       isarmed = TRUE;
+       key = scan();
+    }
+    else if (key == IHEOL) {
+       proutn("Arm NOVAMAX warhead? ");
+       isarmed = ja();
+    }
+    getcd(TRUE, key);
+    if (direc == -1.0) return;
+    nprobes--;
+    angle = ((15.0 - direc) * 0.5235988);
+    probeinx = -sin(angle);
+    probeiny = cos(angle);
+    if (fabs(probeinx) > fabs(probeiny))
+       bigger = fabs(probeinx);
+    else
+       bigger = fabs(probeiny);
+               
+    probeiny /= bigger;
+    probeinx /= bigger;
+    proben = 10.0*dist*bigger +0.5;
+    probex = quadx*QUADSIZE + sectx - 1;       // We will use better packing than original
+    probey = quady*QUADSIZE + secty - 1;
+    probecx = quadx;
+    probecy = quady;
+    game.future[FDSPROB] = game.state.date + 0.01; // Time to move one sector
+    prout("Ensign Chekov-  \"The deep space probe is launched, Captain.\"");
+    ididit = 1;
+    return;
 }
 
-void help(void) {
-       /* There's more than one way to move in this game! */
-       double ddist, xdist, probf;
-       int line = 0, l, ix, iy;
+void help(void) 
+{
+    /* There's more than one way to move in this game! */
+    double ddist, xdist, probf;
+    int line = 0, l, ix, iy;
 
-       chew();
-       /* Test for conditions which prevent calling for help */
-       if (condit == IHDOCKED) {
-               prout("Lt. Uhura-  \"But Captain, we're already docked.\"");
-               return;
-       }
-       if (game.damage[DRADIO] != 0) {
-               prout("Subspace radio damaged.");
-               return;
-       }
-       if (game.state.rembase==0) {
-               prout("Lt. Uhura-  \"Captain, I'm not getting any response from Starbase.\"");
-               return;
-       }
-       if (landed == 1) {
-               proutn("You must be aboard the ");
-               crmshp();
-               prout(".");
-               return;
-       }
-       /* OK -- call for help from nearest starbase */
-       nhelp++;
-       if (basex!=0) {
-               /* There's one in this quadrant */
-               ddist = sqrt(square(basex-sectx)+square(basey-secty));
-       }
-       else {
-               ddist = 1e30;
-               for (l = 1; l <= game.state.rembase; l++) {
-                       xdist=10.0*sqrt(square(game.state.baseqx[l]-quadx)+square(game.state.baseqy[l]-quady));
-                       if (xdist < ddist) {
-                               ddist = xdist;
-                               line = l;
-                       }
-               }
-               /* Since starbase not in quadrant, set up new quadrant */
-               quadx = game.state.baseqx[line];
-               quady = game.state.baseqy[line];
-               newqad(1);
-       }
-       /* dematerialize starship */
-       game.quad[sectx][secty]=IHDOT;
-       proutn("Starbase in %s responds--", cramlc(quadrant, quadx, quady));
-       proutn("");
+    chew();
+    /* Test for conditions which prevent calling for help */
+    if (condit == IHDOCKED) {
+       prout("Lt. Uhura-  \"But Captain, we're already docked.\"");
+       return;
+    }
+    if (game.damage[DRADIO] != 0) {
+       prout("Subspace radio damaged.");
+       return;
+    }
+    if (game.state.rembase==0) {
+       prout("Lt. Uhura-  \"Captain, I'm not getting any response from Starbase.\"");
+       return;
+    }
+    if (landed == 1) {
+       proutn("You must be aboard the ");
        crmshp();
-       prout(" dematerializes.");
-        sectx=0;
-        for (l = 1; l <= 5; l++) {
-                ix = basex+3.0*Rand()-1;
-                iy = basey+3.0*Rand()-1;
-                if (ix>=1 && ix<=QUADSIZE && iy>=1 && iy<=QUADSIZE && game.quad[ix][iy]==IHDOT) {
-                        /* found one -- finish up */
-                        sectx=ix;
-                        secty=iy;
-                        game.quad[ix][iy]=IHMATER0;
-                        break;
-                }
-        }
-        if (sectx==0){
-           prout("You have been lost in space...");
-           finish(FMATERIALIZE);
-           return;
-        }
-       /* Give starbase three chances to rematerialize starship */
-       probf = pow((1.0 - pow(0.98,ddist)), 0.33333333);
-       for (l = 1; l <= 3; l++) {
-               switch (l) {
-                       case 1: proutn("1st"); break;
-                       case 2: proutn("2nd"); break;
-                       case 3: proutn("3rd"); break;
-               }
-               proutn(" attempt to re-materialize ");
-               crmshp();
-               warble();
-               if (Rand() > probf) break;
-                switch (l){
-                       case 1: game.quad[ix][iy]=IHMATER1;
-                               break;
-                       case 2: game.quad[ix][iy]=IHMATER2;
-                               break;
-                       case 3: game.quad[ix][iy]=IHQUEST;
-                               break;
-                }
-                textcolor(RED);
-               prout("fails.");
-                delay(500);
-                textcolor(DEFAULT);
-       }
-       if (l > 3) {
-               finish(FMATERIALIZE);
-               return;
-       }
-       game.quad[ix][iy]=ship;
-       textcolor(GREEN);
-       prout("succeeds.");
+       prout(".");
+       return;
+    }
+    /* OK -- call for help from nearest starbase */
+    nhelp++;
+    if (basex!=0) {
+       /* There's one in this quadrant */
+       ddist = sqrt(square(basex-sectx)+square(basey-secty));
+    }
+    else {
+       ddist = 1e30;
+       for (l = 1; l <= game.state.rembase; l++) {
+           xdist=10.0*sqrt(square(game.state.baseqx[l]-quadx)+square(game.state.baseqy[l]-quady));
+           if (xdist < ddist) {
+               ddist = xdist;
+               line = l;
+           }
+       }
+       /* Since starbase not in quadrant, set up new quadrant */
+       quadx = game.state.baseqx[line];
+       quady = game.state.baseqy[line];
+       newqad(1);
+    }
+    /* dematerialize starship */
+    game.quad[sectx][secty]=IHDOT;
+    proutn("Starbase in %s responds--", cramlc(quadrant, quadx, quady));
+    proutn("");
+    crmshp();
+    prout(" dematerializes.");
+    sectx=0;
+    for (l = 1; l <= 5; l++) {
+       ix = basex+3.0*Rand()-1;
+       iy = basey+3.0*Rand()-1;
+       if (ix>=1 && ix<=QUADSIZE && iy>=1 && iy<=QUADSIZE && game.quad[ix][iy]==IHDOT) {
+           /* found one -- finish up */
+           sectx=ix;
+           secty=iy;
+           game.quad[ix][iy]=IHMATER0;
+           break;
+       }
+    }
+    if (sectx==0){
+       prout("You have been lost in space...");
+       finish(FMATERIALIZE);
+       return;
+    }
+    /* Give starbase three chances to rematerialize starship */
+    probf = pow((1.0 - pow(0.98,ddist)), 0.33333333);
+    for (l = 1; l <= 3; l++) {
+       switch (l) {
+       case 1: proutn("1st"); break;
+       case 2: proutn("2nd"); break;
+       case 3: proutn("3rd"); break;
+       }
+       proutn(" attempt to re-materialize ");
+       crmshp();
+       warble();
+       if (Rand() > probf) break;
+       switch (l){
+       case 1: game.quad[ix][iy]=IHMATER1;
+           break;
+       case 2: game.quad[ix][iy]=IHMATER2;
+           break;
+       case 3: game.quad[ix][iy]=IHQUEST;
+           break;
+       }
+       textcolor(RED);
+       prout("fails.");
+       delay(500);
        textcolor(DEFAULT);
-       dock(0);
-       skip(1);
-       prout("Lt. Uhura-  \"Captain, we made it!\"");
+    }
+    if (l > 3) {
+       finish(FMATERIALIZE);
+       return;
+    }
+    game.quad[ix][iy]=ship;
+    textcolor(GREEN);
+    prout("succeeds.");
+    textcolor(DEFAULT);
+    dock(0);
+    skip(1);
+    prout("Lt. Uhura-  \"Captain, we made it!\"");
 }
index a46e0e2c1d4b8000b6347728d9a8b3d1c01bed50..aaffdd4fe4a8835032ff63cee8e2d08164cf5c06 100644 (file)
--- a/planets.c
+++ b/planets.c
@@ -4,491 +4,499 @@ static int height;
 
 static char *classes[] = {"M","N","O"};
 
-static int consumeTime(void) {
+static int consumeTime(void) 
+{
 /* I think most of this avoidance was caused by overlay scheme.
    Let's see what happens if all events can occur here */
 
-//     double asave;
-       ididit = 1;
+//  double asave;
+    ididit = 1;
 #if 0
-       /* Don't wory about this */
-       if (future[FTBEAM] <= game.state.date+Time && game.state.remcom != 0 && condit != IHDOCKED) {
-               /* We are about to be tractor beamed -- operation fails */
-               return 1;
-       }
+    /* Don't wory about this */
+    if (future[FTBEAM] <= game.state.date+Time && game.state.remcom != 0 && condit != IHDOCKED) {
+       /* We are about to be tractor beamed -- operation fails */
+       return 1;
+    }
 #endif
 //     asave = future[FSNOVA];
 //     future[FSNOVA] = 1e30; /* defer supernovas */
-       events();       /* Used to avoid if future[FSCMOVE] within time */
+    events();  /* Used to avoid if future[FSCMOVE] within time */
 //     future[FSNOVA] = asave;
-       /*fails if game over, quadrant super-novas or we've moved to new quadrant*/
-       if (alldone || game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE || justin != 0) return 1;
-       return 0;
+    /*fails if game over, quadrant super-novas or we've moved to new quadrant*/
+    if (alldone || game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE || justin != 0) return 1;
+    return 0;
 }
 
-void preport(void) {
-       int iknow = 0, i;
-       skip(1);
-       chew();
-       prout("Spock-  \"Planet report follows, Captain.\"");
-       skip(1);
-       for (i = 0; i < inplan; i++) {
-               if (game.state.plnets[i].known != unknown
+void preport(void) 
+{
+    int iknow = 0, i;
+    skip(1);
+    chew();
+    prout("Spock-  \"Planet report follows, Captain.\"");
+    skip(1);
+    for (i = 0; i < inplan; i++) {
+       if (game.state.plnets[i].known != unknown
 #ifdef DEBUG
-                       || ( idebug && game.state.plnets[i].x !=0)
+           || ( idebug && game.state.plnets[i].x !=0)
 #endif
-                       ) {
-                       iknow = 1;
+           ) {
+           iknow = 1;
 #ifdef DEBUG
-                       if (idebug && game.state.plnets[i].known==unknown) proutn("(Unknown) ");
+           if (idebug && game.state.plnets[i].known==unknown) proutn("(Unknown) ");
 #endif
-                       proutn(cramlc(quadrant, game.state.plnets[i].x, game.state.plnets[i].y));
-                       proutn("   class ");
-                       proutn(classes[game.state.plnets[i].pclass]);
-                       proutn("   ");
-                       if (game.state.plnets[i].crystals == 0) proutn("no ");
-                       prout("dilithium crystals present.");
-                       if (game.state.plnets[i].known==shuttle_down) 
-                               prout("    Shuttle Craft Galileo on surface.");
-               }
-       }
-       if (iknow==0) prout("No information available.");
+           proutn(cramlc(quadrant, game.state.plnets[i].x, game.state.plnets[i].y));
+           proutn("   class ");
+           proutn(classes[game.state.plnets[i].pclass]);
+           proutn("   ");
+           if (game.state.plnets[i].crystals == 0) proutn("no ");
+           prout("dilithium crystals present.");
+           if (game.state.plnets[i].known==shuttle_down) 
+               prout("    Shuttle Craft Galileo on surface.");
+       }
+    }
+    if (iknow==0) prout("No information available.");
 }
 
-void orbit(void) {
-       skip(1);
-       chew();
-       if (inorbit!=0) {
-               prout("Already in standard orbit.");
-               return;
-       }
-       if (game.damage[DWARPEN] != 0 && game.damage[DIMPULS] != 0) {
-               prout("Both warp and impulse engines damaged.");
-               return;
-       }
-       if (plnetx == 0 || abs(sectx-plnetx) > 1 || abs(secty-plnety) > 1) {
-               crmshp();
-               prout(" not adjacient to planet.\n");
-               return;
-       }
-       Time = 0.02+0.03*Rand();
-       prout("Helmsman Sulu-  \"Entering standard orbit, Sir.\"");
-       newcnd();
-       if (consumeTime()) return;
-       height = (1400.+7200.*Rand());
-       prout("Sulu-  \"Entered orbit at altitude %.2f kilometers.\"", height);
-       inorbit = 1;
-        ididit=1;
+void orbit(void) 
+{
+    skip(1);
+    chew();
+    if (inorbit!=0) {
+       prout("Already in standard orbit.");
+       return;
+    }
+    if (game.damage[DWARPEN] != 0 && game.damage[DIMPULS] != 0) {
+       prout("Both warp and impulse engines damaged.");
+       return;
+    }
+    if (plnetx == 0 || abs(sectx-plnetx) > 1 || abs(secty-plnety) > 1) {
+       crmshp();
+       prout(" not adjacient to planet.\n");
+       return;
+    }
+    Time = 0.02+0.03*Rand();
+    prout("Helmsman Sulu-  \"Entering standard orbit, Sir.\"");
+    newcnd();
+    if (consumeTime()) return;
+    height = (1400.+7200.*Rand());
+    prout("Sulu-  \"Entered orbit at altitude %.2f kilometers.\"", height);
+    inorbit = 1;
+    ididit=1;
 }
 
-void sensor(void) {
+void sensor(void) 
+{
+    skip(1);
+    chew();
+    if (game.damage[DSRSENS] != 0.0) {
+       prout("Short range sensors damaged.");
+       return;
+    }
+    if (plnetx == 0) {
+       prout("Spock- \"No planet in this quadrant, Captain.\"");
+       return;
+    }
+    if ((plnetx != 0)&&(game.state.plnets[iplnet].known == 0)) {
+       prout("Spock-  \"Sensor scan for %s-", cramlc(quadrant, quadx, quady));
        skip(1);
-       chew();
-       if (game.damage[DSRSENS] != 0.0) {
-               prout("Short range sensors damaged.");
-               return;
-       }
-       if (plnetx == 0) {
-               prout("Spock- \"No planet in this quadrant, Captain.\"");
-               return;
-       }
-       if ((plnetx != 0)&&(game.state.plnets[iplnet].known == 0)) {
-           prout("Spock-  \"Sensor scan for %s-", cramlc(quadrant, quadx, quady));
-           skip(1);
-           prout("         Planet at %s is of class %s.", 
-                  cramlc(sector, plnetx, plnety),
-                  classes[game.state.plnets[iplnet].pclass]);
-           if (game.state.plnets[iplnet].known==shuttle_down) 
-                   prout("         Sensors show Galileo still on surface.");
-           proutn("         Readings indicate");
-           if (game.state.plnets[iplnet].crystals == 0) proutn(" no");
-           prout(" dilithium crystals present.\"");
-           if (game.state.plnets[iplnet].known == unknown) game.state.plnets[iplnet].known = known;
-       }
+       prout("         Planet at %s is of class %s.", 
+             cramlc(sector, plnetx, plnety),
+             classes[game.state.plnets[iplnet].pclass]);
+       if (game.state.plnets[iplnet].known==shuttle_down) 
+           prout("         Sensors show Galileo still on surface.");
+       proutn("         Readings indicate");
+       if (game.state.plnets[iplnet].crystals == 0) proutn(" no");
+       prout(" dilithium crystals present.\"");
+       if (game.state.plnets[iplnet].known == unknown) game.state.plnets[iplnet].known = known;
+    }
 }
 
-void beam(void) {
-       chew();
-       skip(1);
-       if (game.damage[DTRANSP] != 0) {
-               prout("Transporter damaged.");
-               if (game.damage[DSHUTTL]==0 && (game.state.plnets[iplnet].known==shuttle_down || iscraft == 1)) {
-                       skip(1);
-                       proutn("Spock-  \"May I suggest the shuttle craft, Sir?\" ");
-                       if (ja() != 0) shuttle();
-               }
-               return;
-       }
-       if (inorbit==0) {
-               crmshp();
-               prout(" not in standard orbit.");
-               return;
-       }
-       if (shldup!=0) {
-               prout("Impossible to transport through shields.");
-               return;
+void beam(void) 
+{
+    chew();
+    skip(1);
+    if (game.damage[DTRANSP] != 0) {
+       prout("Transporter damaged.");
+       if (game.damage[DSHUTTL]==0 && (game.state.plnets[iplnet].known==shuttle_down || iscraft == 1)) {
+           skip(1);
+           proutn("Spock-  \"May I suggest the shuttle craft, Sir?\" ");
+           if (ja() != 0) shuttle();
        }
-       if (game.state.plnets[iplnet].known==unknown) {
-               prout("Spock-  \"Captain, we have no information on this planet");
-               prout("  and Starfleet Regulations clearly state that in this situation");
-               prout("  you may not go down.\"");
+       return;
+    }
+    if (inorbit==0) {
+       crmshp();
+       prout(" not in standard orbit.");
+       return;
+    }
+    if (shldup!=0) {
+       prout("Impossible to transport through shields.");
+       return;
+    }
+    if (game.state.plnets[iplnet].known==unknown) {
+       prout("Spock-  \"Captain, we have no information on this planet");
+       prout("  and Starfleet Regulations clearly state that in this situation");
+       prout("  you may not go down.\"");
+       return;
+    }
+    if (landed==1) {
+       /* Coming from planet */
+       if (game.state.plnets[iplnet].known==shuttle_down) {
+           proutn("Spock-  \"Wouldn't you rather take the Galileo?\" ");
+           if (ja() != 0) {
+               chew();
                return;
+           }
+           prout("Your crew hides the Galileo to prevent capture by aliens.");
        }
-       if (landed==1) {
-               /* Coming from planet */
-               if (game.state.plnets[iplnet].known==shuttle_down) {
-                       proutn("Spock-  \"Wouldn't you rather take the Galileo?\" ");
-                       if (ja() != 0) {
-                               chew();
-                               return;
-                       }
-                       prout("Your crew hides the Galileo to prevent capture by aliens.");
-               }
-               prout("Landing party assembled, ready to beam up.");
-               skip(1);
-               prout("Kirk whips out communicator...");
-               prouts("BEEP  BEEP  BEEP");
-               skip(2);
-               prout("\"Kirk to enterprise-  Lock on coordinates...energize.\"");
-       }
-       else {
-               /* Going to planet */
-               if (game.state.plnets[iplnet].crystals==0) {
-                       prout("Spock-  \"Captain, I fail to see the logic in");
-                       prout("  exploring a planet with no dilithium crystals.");
-                       proutn("  Are you sure this is wise?\" ");
-                       if (ja()==0) {
-                               chew();
-                               return;
-                       }
-               }
-               prout("Scotty-  \"Transporter room ready, Sir.\"");
-               skip(1);
-               prout("Kirk, and landing party prepare to beam down to planet surface.");
-               skip(1);
-               prout("Kirk-  \"Energize.\"");
-       }
-        ididit=1;
+       prout("Landing party assembled, ready to beam up.");
        skip(1);
-       prouts("WWHOOOIIIIIRRRRREEEE.E.E.  .  .  .  .   .    .");
+       prout("Kirk whips out communicator...");
+       prouts("BEEP  BEEP  BEEP");
        skip(2);
-       if (Rand() > 0.98) {
-               prouts("BOOOIIIOOOIIOOOOIIIOIING . . .");
-               skip(2);
-               prout("Scotty-  \"Oh my God!  I've lost them.\"");
-               finish(FLOST);
+       prout("\"Kirk to enterprise-  Lock on coordinates...energize.\"");
+    }
+    else {
+       /* Going to planet */
+       if (game.state.plnets[iplnet].crystals==0) {
+           prout("Spock-  \"Captain, I fail to see the logic in");
+           prout("  exploring a planet with no dilithium crystals.");
+           proutn("  Are you sure this is wise?\" ");
+           if (ja()==0) {
+               chew();
                return;
+           }
        }
-       prouts(".    .   .  .  .  .  .E.E.EEEERRRRRIIIIIOOOHWW");
+       prout("Scotty-  \"Transporter room ready, Sir.\"");
+       skip(1);
+       prout("Kirk, and landing party prepare to beam down to planet surface.");
+       skip(1);
+       prout("Kirk-  \"Energize.\"");
+    }
+    ididit=1;
+    skip(1);
+    prouts("WWHOOOIIIIIRRRRREEEE.E.E.  .  .  .  .   .    .");
+    skip(2);
+    if (Rand() > 0.98) {
+       prouts("BOOOIIIOOOIIOOOOIIIOIING . . .");
        skip(2);
-       prout("Transport complete.");
-       landed = -landed;
-       if (landed==1 && game.state.plnets[iplnet].known==shuttle_down) {
-               prout("The shuttle craft Galileo is here!");
-       }
-       if (landed!=1 && imine==1) {
-               icrystl = 1;
-               cryprob = 0.05;
-       }
-       imine = 0;
+       prout("Scotty-  \"Oh my God!  I've lost them.\"");
+       finish(FLOST);
        return;
+    }
+    prouts(".    .   .  .  .  .  .E.E.EEEERRRRRIIIIIOOOHWW");
+    skip(2);
+    prout("Transport complete.");
+    landed = -landed;
+    if (landed==1 && game.state.plnets[iplnet].known==shuttle_down) {
+       prout("The shuttle craft Galileo is here!");
+    }
+    if (landed!=1 && imine==1) {
+       icrystl = 1;
+       cryprob = 0.05;
+    }
+    imine = 0;
+    return;
 }
 
-void mine(void) {
+void mine(void) 
+{
+    skip(1);
+    chew();
+    if (landed!= 1) {
+       prout("Mining party not on planet.");
+       return;
+    }
+    if (game.state.plnets[iplnet].crystals == 0) {
+       prout("No dilithium crystals on this planet.");
+       return;
+    }
+    if (imine == 1) {
+       prout("You've already mined enough crystals for this trip.");
+       return;
+    }
+    if (icrystl == 1 && cryprob == 0.05) {
+       proutn("With all those fresh crystals aboard the ");
+       crmshp();
        skip(1);
-       chew();
-       if (landed!= 1) {
-               prout("Mining party not on planet.");
-               return;
-       }
-       if (game.state.plnets[iplnet].crystals == 0) {
-               prout("No dilithium crystals on this planet.");
-               return;
-       }
-       if (imine == 1) {
-               prout("You've already mined enough crystals for this trip.");
-               return;
-       }
-       if (icrystl == 1 && cryprob == 0.05) {
-               proutn("With all those fresh crystals aboard the ");
-               crmshp();
-               skip(1);
-               prout("there's no reason to mine more at this time.");
-               return;
-       }
-       Time = (0.1+0.2*Rand())*game.state.plnets[iplnet].pclass;
-       if (consumeTime()) return;
-       prout("Mining operation complete.");
-       imine = 1;
-        ididit=1;
+       prout("there's no reason to mine more at this time.");
+       return;
+    }
+    Time = (0.1+0.2*Rand())*game.state.plnets[iplnet].pclass;
+    if (consumeTime()) return;
+    prout("Mining operation complete.");
+    imine = 1;
+    ididit=1;
 }
 
-void usecrystals(void) {
-       ididit=0;
-       skip(1);
+void usecrystals(void) 
+{
+    ididit=0;
+    skip(1);
+    chew();
+    if (icrystl!=1) {
+       prout("No dilithium crystals available.");
+       return;
+    }
+    if (energy >= 1000) {
+       prout("Spock-  \"Captain, Starfleet Regulations prohibit such an operation");
+       prout("  except when condition Yellow exists.");
+       return;
+    }
+    prout("Spock- \"Captain, I must warn you that loading");
+    prout("  raw dilithium crystals into the ship's power");
+    prout("  system may risk a severe explosion.");
+    proutn("  Are you sure this is wise?\" ");
+    if (ja()==0) {
        chew();
-       if (icrystl!=1) {
-               prout("No dilithium crystals available.");
-               return;
-       }
-       if (energy >= 1000) {
-               prout("Spock-  \"Captain, Starfleet Regulations prohibit such an operation");
-               prout("  except when condition Yellow exists.");
-               return;
-       }
-       prout("Spock- \"Captain, I must warn you that loading");
-       prout("  raw dilithium crystals into the ship's power");
-       prout("  system may risk a severe explosion.");
-       proutn("  Are you sure this is wise?\" ");
-       if (ja()==0) {
-               chew();
-               return;
-       }
-       skip(1);
-       prout("Engineering Officer Scott-  \"(GULP) Aye Sir.");
-       prout("  Mr. Spock and I will try it.\"");
-       skip(1);
-       prout("Spock-  \"Crystals in place, Sir.");
-       prout("  Ready to activate circuit.\"");
+       return;
+    }
+    skip(1);
+    prout("Engineering Officer Scott-  \"(GULP) Aye Sir.");
+    prout("  Mr. Spock and I will try it.\"");
+    skip(1);
+    prout("Spock-  \"Crystals in place, Sir.");
+    prout("  Ready to activate circuit.\"");
+    skip(1);
+    prouts("Scotty-  \"Keep your fingers crossed, Sir!\"");
+    skip(1);
+    if (Rand() <= cryprob) {
+       prouts("  \"Activating now! - - No good!  It's***");
+       skip(2);
+       prouts("***RED ALERT!  RED A*L********************************");
        skip(1);
-       prouts("Scotty-  \"Keep your fingers crossed, Sir!\"");
+       stars();
+       prouts("******************   KA-BOOM!!!!   *******************");
        skip(1);
-       if (Rand() <= cryprob) {
-               prouts("  \"Activating now! - - No good!  It's***");
-               skip(2);
-               prouts("***RED ALERT!  RED A*L********************************");
-               skip(1);
-               stars();
-               prouts("******************   KA-BOOM!!!!   *******************");
-               skip(1);
-               kaboom();
-               return;
-       }
-       energy += 5000.0*(1.0 + 0.9*Rand());
-       prouts("  \"Activating now! - - ");
-       prout("The instruments");
-       prout("   are going crazy, but I think it's");
-       prout("   going to work!!  Congratulations, Sir!\"");
-       cryprob *= 2.0;
-       ididit=1;
+       kaboom();
+       return;
+    }
+    energy += 5000.0*(1.0 + 0.9*Rand());
+    prouts("  \"Activating now! - - ");
+    prout("The instruments");
+    prout("   are going crazy, but I think it's");
+    prout("   going to work!!  Congratulations, Sir!\"");
+    cryprob *= 2.0;
+    ididit=1;
 }
 
-void shuttle(void) {
-
-       chew();
-       skip(1);
-       if(game.damage[DSHUTTL] != 0.0) {
-               if (game.damage[DSHUTTL] == -1.0) {
-                       if (inorbit && game.state.plnets[iplnet].known == shuttle_down)
-                               prout("Ye Faerie Queene has no shuttle craft bay to dock it at.");
-                       else
-                               prout("Ye Faerie Queene had no shuttle craft.");
-               }
-               else if (game.damage[DSHUTTL] > 0)
-                       prout("The Galileo is damaged.");
-               else prout("Shuttle craft is now serving Big Macs.");
-               return;
-       }
-       if (inorbit==0) {
-               crmshp();
-               prout(" not in standard orbit.");
-               return;
-       }
-       if ((game.state.plnets[iplnet].known != shuttle_down) && iscraft != 1) {
-               prout("Shuttle craft not currently available.");
-               return;
-       }
-       if (landed==-1 && game.state.plnets[iplnet].known==shuttle_down) {
-               prout("You will have to beam down to retrieve the shuttle craft.");
-               return;
-       }
-       if (shldup!=0 || condit == IHDOCKED) {
-               prout("Shuttle craft cannot pass through shields.");
-               return;
-       }
-       if (game.state.plnets[iplnet].known==unknown) {
-               prout("Spock-  \"Captain, we have no information on this planet");
-               prout("  and Starfleet Regulations clearly state that in this situation");
-               prout("  you may not fly down.\"");
-               return;
-       }
-       Time = 3.0e-5*height;
-       if (Time >= 0.8*game.state.remtime) {
-               prout("First Officer Spock-  \"Captain, I compute that such");
-               proutn("  a maneuver would require approximately 2d%% of our",
-                     (int)(100*Time/game.state.remtime));
-               prout("remaining time.");
-               proutn("Are you sure this is wise?\" ");
-               if (ja()==0) {
-                       Time = 0.0;
-                       return;
-               }
-       }
-       if (landed == 1) {
-               /* Kirk on planet */
-               if (iscraft==1) {
-                       /* Galileo on ship! */
-                       if (game.damage[DTRANSP]==0) {
-                               proutn("Spock-  \"Would you rather use the transporter?\" ");
-                               if (ja() != 0) {
-                                       beam();
-                                       return;
-                               }
-                               proutn("Shuttle crew");
-                       }
-                       else
-                               proutn("Rescue party");
-                       prout(" boards Galileo and swoops toward planet surface.");
-                       iscraft = 0;
-                       skip(1);
-                       if (consumeTime()) return;
-                       game.state.plnets[iplnet].known=shuttle_down;
-                       prout("Trip complete.");
-                       return;
-               }
-               else {
-                       /* Ready to go back to ship */
-                       prout("You and your mining party board the");
-                       prout("shuttle craft for the trip back to the Enterprise.");
-                       skip(1);
-                       prout("The short hop begins . . .");
-                       game.state.plnets[iplnet].known=known;
-                       icraft = 1;
-                       skip(1);
-                       landed = -1;
-                       if (consumeTime()) return;
-                       iscraft = 1;
-                       icraft = 0;
-                       if (imine!=0) {
-                               icrystl = 1;
-                               cryprob = 0.05;
-                       }
-                       imine = 0;
-                       prout("Trip complete.");
-                       return;
+void shuttle(void) 
+{
+    chew();
+    skip(1);
+    if(game.damage[DSHUTTL] != 0.0) {
+       if (game.damage[DSHUTTL] == -1.0) {
+           if (inorbit && game.state.plnets[iplnet].known == shuttle_down)
+               prout("Ye Faerie Queene has no shuttle craft bay to dock it at.");
+           else
+               prout("Ye Faerie Queene had no shuttle craft.");
+       }
+       else if (game.damage[DSHUTTL] > 0)
+           prout("The Galileo is damaged.");
+       else prout("Shuttle craft is now serving Big Macs.");
+       return;
+    }
+    if (inorbit==0) {
+       crmshp();
+       prout(" not in standard orbit.");
+       return;
+    }
+    if ((game.state.plnets[iplnet].known != shuttle_down) && iscraft != 1) {
+       prout("Shuttle craft not currently available.");
+       return;
+    }
+    if (landed==-1 && game.state.plnets[iplnet].known==shuttle_down) {
+       prout("You will have to beam down to retrieve the shuttle craft.");
+       return;
+    }
+    if (shldup!=0 || condit == IHDOCKED) {
+       prout("Shuttle craft cannot pass through shields.");
+       return;
+    }
+    if (game.state.plnets[iplnet].known==unknown) {
+       prout("Spock-  \"Captain, we have no information on this planet");
+       prout("  and Starfleet Regulations clearly state that in this situation");
+       prout("  you may not fly down.\"");
+       return;
+    }
+    Time = 3.0e-5*height;
+    if (Time >= 0.8*game.state.remtime) {
+       prout("First Officer Spock-  \"Captain, I compute that such");
+       proutn("  a maneuver would require approximately 2d%% of our",
+              (int)(100*Time/game.state.remtime));
+       prout("remaining time.");
+       proutn("Are you sure this is wise?\" ");
+       if (ja()==0) {
+           Time = 0.0;
+           return;
+       }
+    }
+    if (landed == 1) {
+       /* Kirk on planet */
+       if (iscraft==1) {
+           /* Galileo on ship! */
+           if (game.damage[DTRANSP]==0) {
+               proutn("Spock-  \"Would you rather use the transporter?\" ");
+               if (ja() != 0) {
+                   beam();
+                   return;
                }
+               proutn("Shuttle crew");
+           }
+           else
+               proutn("Rescue party");
+           prout(" boards Galileo and swoops toward planet surface.");
+           iscraft = 0;
+           skip(1);
+           if (consumeTime()) return;
+           game.state.plnets[iplnet].known=shuttle_down;
+           prout("Trip complete.");
+           return;
        }
        else {
-               /* Kirk on ship */
-               /* and so is Galileo */
-               prout("Mining party assembles in the hangar deck,");
-               prout("ready to board the shuttle craft \"Galileo\".");
-               skip(1);
-               prouts("The hangar doors open; the trip begins.");
-               skip(1);
-               icraft = 1;
-               iscraft = 0;
-               if (consumeTime()) return;
-               game.state.plnets[iplnet].known = shuttle_down;
-               landed = 1;
-               icraft = 0;
-               prout("Trip complete");
-               return;
-       }
+           /* Ready to go back to ship */
+           prout("You and your mining party board the");
+           prout("shuttle craft for the trip back to the Enterprise.");
+           skip(1);
+           prout("The short hop begins . . .");
+           game.state.plnets[iplnet].known=known;
+           icraft = 1;
+           skip(1);
+           landed = -1;
+           if (consumeTime()) return;
+           iscraft = 1;
+           icraft = 0;
+           if (imine!=0) {
+               icrystl = 1;
+               cryprob = 0.05;
+           }
+           imine = 0;
+           prout("Trip complete.");
+           return;
+       }
+    }
+    else {
+       /* Kirk on ship */
+       /* and so is Galileo */
+       prout("Mining party assembles in the hangar deck,");
+       prout("ready to board the shuttle craft \"Galileo\".");
+       skip(1);
+       prouts("The hangar doors open; the trip begins.");
+       skip(1);
+       icraft = 1;
+       iscraft = 0;
+       if (consumeTime()) return;
+       game.state.plnets[iplnet].known = shuttle_down;
+       landed = 1;
+       icraft = 0;
+       prout("Trip complete");
+       return;
+    }
 }
 
-void deathray(void) {
-       double r = Rand();
+void deathray(void) 
+{
+    double r = Rand();
        
-       ididit = 0;
-       skip(1);
-       chew();
-       if (ship != IHE) {
-               prout("Ye Faerie Queene has no death ray.");
-               return;
-       }
-       if (nenhere==0) {
-               prout("Sulu-  \"But Sir, there are no enemies in this quadrant.\"");
-               return;
+    ididit = 0;
+    skip(1);
+    chew();
+    if (ship != IHE) {
+       prout("Ye Faerie Queene has no death ray.");
+       return;
+    }
+    if (nenhere==0) {
+       prout("Sulu-  \"But Sir, there are no enemies in this quadrant.\"");
+       return;
+    }
+    if (game.damage[DDRAY] > 0.0) {
+       prout("Death Ray is damaged.");
+       return;
+    }
+    prout("Spock-  \"Captain, the 'Experimental Death Ray'");
+    prout("  is highly unpredictible.  Considering the alternatives,");
+    proutn("  are you sure this is wise?\" ");
+    if (ja()==0) return;
+    prout("Spock-  \"Acknowledged.\"");
+    skip(1);
+    ididit=1;
+    prouts("WHOOEE ... WHOOEE ... WHOOEE ... WHOOEE");
+    skip(1);
+    prout("Crew scrambles in emergency preparation.");
+    prout("Spock and Scotty ready the death ray and");
+    prout("prepare to channel all ship's power to the device.");
+    skip(1);
+    prout("Spock-  \"Preparations complete, sir.\"");
+    prout("Kirk-  \"Engage!\"");
+    skip(1);
+    prouts("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
+    skip(1);
+    if (r > .30) {
+       prouts("Sulu- \"Captain!  It's working!\"");
+       skip(2);
+       while (nenhere > 0)
+           deadkl(game.kx[1],game.ky[1],game.quad[game.kx[1]][game.ky[1]],game.kx[1],game.ky[1]);
+       prout("Ensign Chekov-  \"Congratulations, Captain!\"");
+       if (game.state.remkl == 0) finish(FWON);
+       prout("Spock-  \"Captain, I believe the `Experimental Death Ray'");
+       if (Rand() <= 0.05) {
+           prout("   is still operational.\"");
        }
-       if (game.damage[DDRAY] > 0.0) {
-               prout("Death Ray is damaged.");
-               return;
+       else {
+           prout("   has been rendered nonfunctional.\"");
+           game.damage[DDRAY] = 39.95;
        }
-       prout("Spock-  \"Captain, the 'Experimental Death Ray'");
-       prout("  is highly unpredictible.  Considering the alternatives,");
-       proutn("  are you sure this is wise?\" ");
-       if (ja()==0) return;
-       prout("Spock-  \"Acknowledged.\"");
+       return;
+    }
+    r = Rand();        // Pick failure method 
+    if (r <= .30) {
+       prouts("Sulu- \"Captain!  It's working!\"");
        skip(1);
-       ididit=1;
-       prouts("WHOOEE ... WHOOEE ... WHOOEE ... WHOOEE");
+       prouts("***RED ALERT!  RED ALERT!");
        skip(1);
-       prout("Crew scrambles in emergency preparation.");
-       prout("Spock and Scotty ready the death ray and");
-       prout("prepare to channel all ship's power to the device.");
+       prout("***MATTER-ANTIMATTER IMPLOSION IMMINENT!");
        skip(1);
-       prout("Spock-  \"Preparations complete, sir.\"");
-       prout("Kirk-  \"Engage!\"");
+       prouts("***RED ALERT!  RED A*L********************************");
        skip(1);
-       prouts("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR");
+       stars();
+       prouts("******************   KA-BOOM!!!!   *******************");
        skip(1);
-       if (r > .30) {
-               prouts("Sulu- \"Captain!  It's working!\"");
-               skip(2);
-               while (nenhere > 0)
-                       deadkl(game.kx[1],game.ky[1],game.quad[game.kx[1]][game.ky[1]],game.kx[1],game.ky[1]);
-               prout("Ensign Chekov-  \"Congratulations, Captain!\"");
-               if (game.state.remkl == 0) finish(FWON);
-               prout("Spock-  \"Captain, I believe the `Experimental Death Ray'");
-               if (Rand() <= 0.05) {
-                       prout("   is still operational.\"");
-               }
-               else {
-                       prout("   has been rendered nonfunctional.\"");
-                       game.damage[DDRAY] = 39.95;
-               }
-               return;
-       }
-       r = Rand();     // Pick failure method 
-       if (r <= .30) {
-               prouts("Sulu- \"Captain!  It's working!\"");
-               skip(1);
-               prouts("***RED ALERT!  RED ALERT!");
-               skip(1);
-               prout("***MATTER-ANTIMATTER IMPLOSION IMMINENT!");
-               skip(1);
-               prouts("***RED ALERT!  RED A*L********************************");
-               skip(1);
-               stars();
-               prouts("******************   KA-BOOM!!!!   *******************");
-               skip(1);
-               kaboom();
-               return;
-       }
-       if (r <= .55) {
-               prouts("Sulu- \"Captain!  Yagabandaghangrapl, brachriigringlanbla!\"");
-               skip(1);
-               prout("Lt. Uhura-  \"Graaeek!  Graaeek!\"");
-               skip(1);
-               prout("Spock-  \"Facinating!  . . . All humans aboard");
-               prout("  have apparently been transformed into strange mutations.");
-               prout("  Vulcans do not seem to be affected.");
-               skip(1);
-               prout("Kirk-  \"Raauch!  Raauch!\"");
-               finish(FDRAY);
-               return;
-       }
-       if (r <= 0.75) {
-               int i,j;
-               prouts("Sulu- \"Captain!  It's   --WHAT?!?!\"");
-               skip(2);
-               proutn("Spock-  \"I believe the word is");
-               prouts(" *ASTONISHING*");
-               prout(" Mr. Sulu.");
-               for (i=1; i<=QUADSIZE; i++)
-                       for (j=1; j<=QUADSIZE; j++)
-                               if (game.quad[i][j] == IHDOT) game.quad[i][j] = IHQUEST;
-               prout("  Captain, our quadrant is now infested with");
-               prouts(" - - - - - -  *THINGS*.");
-               skip(1);
-               prout("  I have no logical explanation.\"");
-               return;
-       }
-       prouts("Sulu- \"Captain!  The Death Ray is creating tribbles!\"");
+       kaboom();
+       return;
+    }
+    if (r <= .55) {
+       prouts("Sulu- \"Captain!  Yagabandaghangrapl, brachriigringlanbla!\"");
+       skip(1);
+       prout("Lt. Uhura-  \"Graaeek!  Graaeek!\"");
+       skip(1);
+       prout("Spock-  \"Facinating!  . . . All humans aboard");
+       prout("  have apparently been transformed into strange mutations.");
+       prout("  Vulcans do not seem to be affected.");
+       skip(1);
+       prout("Kirk-  \"Raauch!  Raauch!\"");
+       finish(FDRAY);
+       return;
+    }
+    if (r <= 0.75) {
+       int i,j;
+       prouts("Sulu- \"Captain!  It's   --WHAT?!?!\"");
+       skip(2);
+       proutn("Spock-  \"I believe the word is");
+       prouts(" *ASTONISHING*");
+       prout(" Mr. Sulu.");
+       for (i=1; i<=QUADSIZE; i++)
+           for (j=1; j<=QUADSIZE; j++)
+               if (game.quad[i][j] == IHDOT) game.quad[i][j] = IHQUEST;
+       prout("  Captain, our quadrant is now infested with");
+       prouts(" - - - - - -  *THINGS*.");
        skip(1);
-       prout("Scotty-  \"There are so many tribbles down here");
-       prout("  in Engineering, we can't move for 'em, Captain.\"");
-       finish(FTRIBBLE);
+       prout("  I have no logical explanation.\"");
        return;
+    }
+    prouts("Sulu- \"Captain!  The Death Ray is creating tribbles!\"");
+    skip(1);
+    prout("Scotty-  \"There are so many tribbles down here");
+    prout("  in Engineering, we can't move for 'em, Captain.\"");
+    finish(FTRIBBLE);
+    return;
 }
index e5d261be0f97b41c11686f1c44b14db8cbecf652..e6c9f6e5a98df0d0f72d1e649e036af4d0e46d14 100644 (file)
--- a/reports.c
+++ b/reports.c
 #include <stdlib.h>
 #include <string.h>
 
-void attakreport(int curt) {
-     if (!curt) {
+void attakreport(int curt) 
+{
+    if (!curt) {
        if (game.future[FCDBAS] < 1e30) {
-               prout("Starbase in %s is currently under Commander attack.",
-                     cramlc(quadrant, batx, baty));
-               prout("It can hold out until Stardate %d.", 
-                     (int)game.future[FCDBAS]);
+           prout("Starbase in %s is currently under Commander attack.",
+                 cramlc(quadrant, batx, baty));
+           prout("It can hold out until Stardate %d.", 
+                 (int)game.future[FCDBAS]);
        }
        if (isatb == 1) {
-               prout("Starbase in %s is under Super-commander attack.",
-                     cramlc(quadrant, game.state.isx, game.state.isy));
-               prout("It can hold out until Stardate %d.", 
-                     (int)game.future[FSCDBAS]);
+           prout("Starbase in %s is under Super-commander attack.",
+                 cramlc(quadrant, game.state.isx, game.state.isy));
+           prout("It can hold out until Stardate %d.", 
+                 (int)game.future[FSCDBAS]);
        }
-     } else {
+    } else {
         if (game.future[FCDBAS] < 1e30)
-           proutn("Base in %i - %i attacked by C. Alive until %.1f", batx, baty, game.future[FCDBAS]);
+           proutn("Base in %i - %i attacked by C. Alive until %.1f", batx, baty, game.future[FCDBAS]);
         if (isatb == 1)
-           proutn("Base in %i - %i attacked by S. Alive until %.1f", game.state.isx, game.state.isy, game.future[FSCDBAS]);
-     }
-     clreol();
+           proutn("Base in %i - %i attacked by S. Alive until %.1f", game.state.isx, game.state.isy, game.future[FSCDBAS]);
+    }
+    clreol();
 }
        
 
-void report(void) {
-       char *s1,*s2,*s3;
+void report(void) 
+{
+    char *s1,*s2,*s3;
 
-       chew();
-       s1 = (thawed?"thawed ":"");
-       switch (length) {
-               case 1: s2="short"; break;
-               case 2: s2="medium"; break;
-               case 4: s2="long"; break;
-               default: s2="unknown length"; break;
-       }
-       switch (skill) {
-               case 1: s3="novice"; break;
-               case 2: s3="fair"; break;
-               case 3: s3="good"; break;
-               case 4: s3="expert"; break;
-               case 5: s3="emeritus"; break;
-               default: s3="skilled"; break;
-       }
-       prout("");
-       prout("You %s playing a %s%s %s game.",
-                  alldone? "were": "are now", s1, s2, s3);
-       if (skill>3 && thawed && !alldone) prout("No plaque is allowed.");
-       if (tourn) prout("This is tournament game %d.", tourn);
-       prout("Your secret password is \"%s\"",game.passwd);
-       proutn("%d of %d Klingons have been killed",
-                  game.state.killk+game.state.killc+game.state.nsckill, inkling);
-       if (game.state.killc) prout(", including %d Commander%s.", game.state.killc, game.state.killc==1?"":"s");
-       else if (game.state.killk+game.state.nsckill > 0) prout(", but no Commanders.");
-       else prout(".");
-       if (skill > 2) prout("The Super Commander has %sbeen destroyed.",
-                                                 game.state.nscrem?"not ":"");
-       if (game.state.rembase != inbase) {
-               proutn("There ");
-               if (inbase-game.state.rembase==1) proutn("has been 1 base");
-               else {
-                   proutn("have been %d bases", inbase-game.state.rembase);
-               }
-               prout(" destroyed, %d remaining.", game.state.rembase);
-       }
-       else prout("There are %d bases.", inbase);
-       if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED || iseenit) {
-               /* Don't report this if not seen and
-                       either the radio is dead or not at base! */
-               attakreport(0);
-               iseenit = 1;
-       }
-       if (casual) prout("%d casualt%s suffered so far.",
-                                          casual, casual==1? "y" : "ies");
-       if (nhelp) prout("There were %d call%s for help.",
-                                         nhelp, nhelp==1 ? "" : "s");
-       if (ship == IHE) {
-               proutn("You have ");
-               if (nprobes) proutn("%d", nprobes);
-               else proutn("no");
-               proutn(" deep space probe");
-               if (nprobes!=1) proutn("s");
-               prout(".");
-       }
-       if ((game.damage[DRADIO] == 0.0 || condit == IHDOCKED)&&
-               game.future[FDSPROB] != 1e30) {
-               if (isarmed) 
-                       proutn("An armed deep space probe is in");
-               else
-                       proutn("A deep space probe is in");
-               proutn(cramlc(quadrant, probecx, probecy));
-               prout(".");
+    chew();
+    s1 = (thawed?"thawed ":"");
+    switch (length) {
+    case 1: s2="short"; break;
+    case 2: s2="medium"; break;
+    case 4: s2="long"; break;
+    default: s2="unknown length"; break;
+    }
+    switch (skill) {
+    case SKILL_NOVICE: s3="novice"; break;
+    case SKILL_FAIR: s3="fair"; break;
+    case SKILL_GOOD: s3="good"; break;
+    case SKILL_EXPERT: s3="expert"; break;
+    case SKILL_EMERITUS: s3="emeritus"; break;
+    default: s3="skilled"; break;
+    }
+    prout("");
+    prout("You %s playing a %s%s %s game.",
+         alldone? "were": "are now", s1, s2, s3);
+    if (skill>SKILL_GOOD && thawed && !alldone) prout("No plaque is allowed.");
+    if (tourn) prout("This is tournament game %d.", tourn);
+    prout("Your secret password is \"%s\"",game.passwd);
+    proutn("%d of %d Klingons have been killed",
+          game.state.killk+game.state.killc+game.state.nsckill, inkling);
+    if (game.state.killc) prout(", including %d Commander%s.", game.state.killc, game.state.killc==1?"":"s");
+    else if (game.state.killk+game.state.nsckill > 0) prout(", but no Commanders.");
+    else prout(".");
+    if (skill > SKILL_FAIR) prout("The Super Commander has %sbeen destroyed.",
+                                 game.state.nscrem?"not ":"");
+    if (game.state.rembase != inbase) {
+       proutn("There ");
+       if (inbase-game.state.rembase==1) proutn("has been 1 base");
+       else {
+           proutn("have been %d bases", inbase-game.state.rembase);
        }
-       if (icrystl) {
-               if (cryprob <= .05)
-                       prout("Dilithium crystals aboard ship... not yet used.");
-               else {
-                       int i=0;
-                       double ai = 0.05;
-                       while (cryprob > ai) {
-                               ai *= 2.0;
-                               i++;
-                       }
-                       prout("Dilithium crystals have been used %d time%s.",
-                                  i, i==1? "" : "s");
-               }
+       prout(" destroyed, %d remaining.", game.state.rembase);
+    }
+    else prout("There are %d bases.", inbase);
+    if (game.damage[DRADIO] == 0.0 || condit == IHDOCKED || iseenit) {
+       /* Don't report this if not seen and
+          either the radio is dead or not at base! */
+       attakreport(0);
+       iseenit = 1;
+    }
+    if (casual) prout("%d casualt%s suffered so far.",
+                     casual, casual==1? "y" : "ies");
+    if (nhelp) prout("There were %d call%s for help.",
+                    nhelp, nhelp==1 ? "" : "s");
+    if (ship == IHE) {
+       proutn("You have ");
+       if (nprobes) proutn("%d", nprobes);
+       else proutn("no");
+       proutn(" deep space probe");
+       if (nprobes!=1) proutn("s");
+       prout(".");
+    }
+    if ((game.damage[DRADIO] == 0.0 || condit == IHDOCKED)&&
+       game.future[FDSPROB] != 1e30) {
+       if (isarmed) 
+           proutn("An armed deep space probe is in");
+       else
+           proutn("A deep space probe is in");
+       proutn(cramlc(quadrant, probecx, probecy));
+       prout(".");
+    }
+    if (icrystl) {
+       if (cryprob <= .05)
+           prout("Dilithium crystals aboard ship... not yet used.");
+       else {
+           int i=0;
+           double ai = 0.05;
+           while (cryprob > ai) {
+               ai *= 2.0;
+               i++;
+           }
+           prout("Dilithium crystals have been used %d time%s.",
+                 i, i==1? "" : "s");
        }
-       skip(1);
+    }
+    skip(1);
 }
        
-void lrscan(void) {
-       int x, y;
-       chew();
-       if (game.damage[DLRSENS] != 0.0) {
-               /* Now allow base's sensors if docked */
-               if (condit != IHDOCKED) {
-                       prout("LONG-RANGE SENSORS DAMAGED.");
-                       return;
-               }
-               proutn("Starbase's long-range scan");
-       }
-       else {
-               prout("Long-range scan");
+void lrscan(void) 
+{
+    int x, y;
+    chew();
+    if (game.damage[DLRSENS] != 0.0) {
+       /* Now allow base's sensors if docked */
+       if (condit != IHDOCKED) {
+           prout("LONG-RANGE SENSORS DAMAGED.");
+           return;
        }
-       for (x = quadx-1; x <= quadx+1; x++) {
-               proutn(" ");
-               for (y = quady-1; y <= quady+1; y++) {
-                       if (x == 0 || x > GALSIZE || y == 0 || y > GALSIZE)
-                                proutn("  -1");
-                       else {
-                                if (game.state.galaxy[x][y]<SUPERNOVA_PLACE) proutn(" %3d", game.state.galaxy[x][y]);
-                                else proutn("***");
-                               game.starch[x][y] = game.damage[DRADIO] > 0 ? game.state.galaxy[x][y]+SUPERNOVA_PLACE : 1;
-                       }
-               }
-                prout(" ");
+       proutn("Starbase's long-range scan");
+    }
+    else {
+       prout("Long-range scan");
+    }
+    for (x = quadx-1; x <= quadx+1; x++) {
+       proutn(" ");
+       for (y = quady-1; y <= quady+1; y++) {
+           if (x == 0 || x > GALSIZE || y == 0 || y > GALSIZE)
+               proutn("  -1");
+           else {
+               if (game.state.galaxy[x][y]<SUPERNOVA_PLACE) proutn(" %3d", game.state.galaxy[x][y]);
+               else proutn("***");
+               game.starch[x][y] = game.damage[DRADIO] > 0 ? game.state.galaxy[x][y]+SUPERNOVA_PLACE : 1;
+           }
        }
+       prout(" ");
+    }
 }
 
-void dreprt(void) {
-       int jdam = FALSE, i;
-       chew();
+void dreprt(void) 
+{
+    int jdam = FALSE, i;
+    chew();
 
-       for (i = 1; i <= NDEVICES; i++) {
-               if (game.damage[i] > 0.0) {
-                       if (!jdam) {
-                               prout("DEVICE            -REPAIR TIMES-");
-                               prout("                IN FLIGHT   DOCKED");
-                               jdam = TRUE;
-                       }
-                       prout("  %16s %8.2f  %8.2f", 
-                               device[i],
-                               game.damage[i]+0.05,
-                               docfac*game.damage[i]+0.005);
-               }
+    for (i = 1; i <= NDEVICES; i++) {
+       if (game.damage[i] > 0.0) {
+           if (!jdam) {
+               prout("DEVICE            -REPAIR TIMES-");
+               prout("                IN FLIGHT   DOCKED");
+               jdam = TRUE;
+           }
+           prout("  %16s %8.2f  %8.2f", 
+                 device[i],
+                 game.damage[i]+0.05,
+                 docfac*game.damage[i]+0.005);
        }
-       if (!jdam) prout("All devices functional.");
+    }
+    if (!jdam) prout("All devices functional.");
 }
 
-void chart(int nn) {
-       int i,j;
-       char *cp;
-       chew();
-       if (stdamtim != 1e30 && stdamtim != game.state.date && condit == IHDOCKED) {
-                proutn("Spock-  \"I revised the Star Chart from the starbase's records.\"\n\r");
+void chart(int nn) 
+{
+    int i,j;
+    char *cp;
+    chew();
+    if (stdamtim != 1e30 && stdamtim != game.state.date && condit == IHDOCKED) {
+       proutn("Spock-  \"I revised the Star Chart from the starbase's records.\"\n\r");
+    }
+    if (nn == 0) proutn("       STAR CHART FOR THE KNOWN GALAXY\n\r");
+    if (stdamtim != 1e30) {
+       if (condit == IHDOCKED) {
+           /* We are docked, so restore chart from base information */
+           stdamtim = game.state.date;
+           for (i=1; i <= GALSIZE ; i++)
+               for (j=1; j <= GALSIZE; j++)
+                   if (game.starch[i][j] == 1) game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE;
        }
-        if (nn == 0) proutn("       STAR CHART FOR THE KNOWN GALAXY\n\r");
-       if (stdamtim != 1e30) {
-               if (condit == IHDOCKED) {
-                       /* We are docked, so restore chart from base information */
-                       stdamtim = game.state.date;
-                       for (i=1; i <= GALSIZE ; i++)
-                               for (j=1; j <= GALSIZE; j++)
-                                       if (game.starch[i][j] == 1) game.starch[i][j] = game.state.galaxy[i][j]+SUPERNOVA_PLACE;
-               }
-               else {
-                   proutn("(Last surveillance update %d stardates ago.",
-                          (int)(game.state.date-stdamtim));
-               }
+       else {
+           proutn("(Last surveillance update %d stardates ago.",
+                  (int)(game.state.date-stdamtim));
        }
+    }
 
-       prout("      1    2    3    4    5    6    7    8");
-       for (i = 1; i <= GALSIZE; i++) {
-                proutn("%d |", i);
-               for (j = 1; j <= GALSIZE; j++) {
-                       char buf[4];
-                        proutn("  ");
-                       if (game.starch[i][j] == CHART_UNKNOWN)
-                                strcpy(buf, ".1.");
-                       else if (game.starch[i][j] == 0)
-                                strcpy(buf, "...");
-                        else if (game.state.galaxy[i][j]>=SUPERNOVA_PLACE)
-                                strcpy(buf, "***");
-                       else
-                               sprintf(buf, "%03d", game.state.galaxy[i][j]);
-                       for (cp = buf; cp < buf + sizeof(buf); cp++)
-                           if (*cp == '0')
-                               *cp = '.';
-                       proutn(buf);
-               }
-                proutn("  |");
-                if (i<GALSIZE) proutn("\n\r");
+    prout("      1    2    3    4    5    6    7    8");
+    for (i = 1; i <= GALSIZE; i++) {
+       proutn("%d |", i);
+       for (j = 1; j <= GALSIZE; j++) {
+           char buf[4];
+           proutn("  ");
+           if (game.starch[i][j] == CHART_UNKNOWN)
+               strcpy(buf, ".1.");
+           else if (game.starch[i][j] == 0)
+               strcpy(buf, "...");
+           else if (game.state.galaxy[i][j]>=SUPERNOVA_PLACE)
+               strcpy(buf, "***");
+           else
+               sprintf(buf, "%03d", game.state.galaxy[i][j]);
+           for (cp = buf; cp < buf + sizeof(buf); cp++)
+               if (*cp == '0')
+                   *cp = '.';
+           proutn(buf);
        }
-       prout("");      /* flush output */
+       proutn("  |");
+       if (i<GALSIZE) proutn("\n\r");
+    }
+    prout(""); /* flush output */
 }
 
-static void sectscan(int goodScan, int i, int j) {
+static void sectscan(int goodScan, int i, int j) 
+{
     if (goodScan || (abs(i-sectx)<= 1 && abs(j-secty) <= 1)){
        if ((game.quad[i][j]==IHMATER0)||(game.quad[i][j]==IHMATER1)||(game.quad[i][j]==IHMATER2)||(game.quad[i][j]==IHE)||(game.quad[i][j]==IHF)){
            switch (condit) {
@@ -230,7 +236,8 @@ static void sectscan(int goodScan, int i, int j) {
        proutn("- ");
 }
 
-static void status(int req) {
+static void status(int req) 
+{
     char *cp = NULL;
     int t, dam = 0;
     switch (req) {
@@ -293,20 +300,21 @@ static void status(int req) {
     case 10:
        attakreport(1);
        break;
-    /*
-     * Note: attakreport() can in some cases produce two lines of
-     * output.  If that happens, and QUADSIZE is the normal 10, items
-     * 11 and up will be printed past the bottom of the quadrant display.
-     * Under the curses display logic they will get lost because they're
-     * written outside the report window.
-     */
+       /*
+        * Note: attakreport() can in some cases produce two lines of
+        * output.  If that happens, and QUADSIZE is the normal 10, items
+        * 11 and up will be printed past the bottom of the quadrant display.
+        * Under the curses display logic they will get lost because they're
+        * written outside the report window.
+        */
     case 11:   /* ESR */
        proutn("Bases Left    %d", game.state.rembase);
        break;
     }
 }
                
-int srscan(int l) {
+int srscan(int l) 
+{
     static char requests[][3] =
        {"","da","co","po","ls","wa","en","to","sh","kl","ti", "ba"};
     int leftside=TRUE, rightside=TRUE, i, j, jj, req=0, nn=FALSE;
@@ -373,147 +381,148 @@ int srscan(int l) {
 }
                        
                        
-void eta(void) {
-        int ix1, ix2, iy1, iy2, prompt=FALSE;
-       int wfl;
-       double ttime, twarp, tpower;
-       if (game.damage[DCOMPTR] != 0.0) {
-               prout("COMPUTER DAMAGED, USE A POCKET CALCULATOR.");
-               skip(1);
-               return;
+void eta(void)
+{
+    int ix1, ix2, iy1, iy2, prompt=FALSE;
+    int wfl;
+    double ttime, twarp, tpower;
+    if (game.damage[DCOMPTR] != 0.0) {
+       prout("COMPUTER DAMAGED, USE A POCKET CALCULATOR.");
+       skip(1);
+       return;
+    }
+    if (scan() != IHREAL) {
+       prompt = TRUE;
+       chew();
+       proutn("Destination quadrant and/or sector? ");
+       if (scan()!=IHREAL) {
+           huh();
+           return;
        }
+    }
+    iy1 = aaitem +0.5;
+    if (scan() != IHREAL) {
+       huh();
+       return;
+    }
+    ix1 = aaitem + 0.5;
+    if (scan() == IHREAL) {
+       iy2 = aaitem + 0.5;
        if (scan() != IHREAL) {
-               prompt = TRUE;
+           huh();
+           return;
+       }
+       ix2 = aaitem + 0.5;
+    }
+    else {
+       if (quady>ix1) ix2 = 1;
+       else ix2=QUADSIZE;
+       if (quadx>iy1) iy2 = 1;
+       else iy2=QUADSIZE;
+    }
+
+    if (ix1 > GALSIZE || ix1 < 1 || iy1 > GALSIZE || iy1 < 1 ||
+       ix2 > QUADSIZE || ix2 < 1 || iy2 > QUADSIZE || iy2 < 1) {
+       huh();
+       return;
+    }
+    dist = sqrt(square(iy1-quadx+0.1*(iy2-sectx))+
+               square(ix1-quady+0.1*(ix2-secty)));
+    wfl = FALSE;
+
+    if (prompt) prout("Answer \"no\" if you don't know the value:");
+    while (TRUE) {
+       chew();
+       proutn("Time or arrival date? ");
+       if (scan()==IHREAL) {
+           ttime = aaitem;
+           if (ttime > game.state.date) ttime -= game.state.date; // Actually a star date
+           if (ttime <= 1e-10 ||
+               (twarp=(floor(sqrt((10.0*dist)/ttime)*10.0)+1.0)/10.0) > 10) {
+               prout("We'll never make it, sir.");
                chew();
-               proutn("Destination quadrant and/or sector? ");
-               if (scan()!=IHREAL) {
-                       huh();
-                       return;
-               }
+               return;
+           }
+           if (twarp < 1.0) twarp = 1.0;
+           break;
        }
-       iy1 = aaitem +0.5;
-       if (scan() != IHREAL) {
+       chew();
+       proutn("Warp factor? ");
+       if (scan()== IHREAL) {
+           wfl = TRUE;
+           twarp = aaitem;
+           if (twarp<1.0 || twarp > 10.0) {
                huh();
                return;
+           }
+           break;
        }
-       ix1 = aaitem + 0.5;
-       if (scan() == IHREAL) {
-               iy2 = aaitem + 0.5;
-               if (scan() != IHREAL) {
+       prout("Captain, certainly you can give me one of these.");
+    }
+    while (TRUE) {
+       chew();
+       ttime = (10.0*dist)/square(twarp);
+       tpower = dist*twarp*twarp*twarp*(shldup+1);
+       if (tpower >= energy) {
+           prout("Insufficient energy, sir.");
+           if (shldup==0 || tpower > energy*2.0) {
+               if (!wfl) return;
+               proutn("New warp factor to try? ");
+               if (scan() == IHREAL) {
+                   wfl = TRUE;
+                   twarp = aaitem;
+                   if (twarp<1.0 || twarp > 10.0) {
                        huh();
                        return;
+                   }
+                   continue;
                }
-               ix2 = aaitem + 0.5;
+               else {
+                   chew();
+                   skip(1);
+                   return;
+               }
+           }
+           prout("But if you lower your shields,");
+           proutn("remaining");
+           tpower /= 2;
        }
-        else {
-                if (quady>ix1) ix2 = 1;
-                else ix2=QUADSIZE;
-                if (quadx>iy1) iy2 = 1;
-                else iy2=QUADSIZE;
+       else
+           proutn("Remaining");
+       prout(" energy will be %.2f.", energy-tpower);
+       if (wfl) {
+           prout("And we will arrive at stardate %.2f.",
+                 game.state.date+ttime);
        }
-
-       if (ix1 > GALSIZE || ix1 < 1 || iy1 > GALSIZE || iy1 < 1 ||
-               ix2 > QUADSIZE || ix2 < 1 || iy2 > QUADSIZE || iy2 < 1) {
+       else if (twarp==1.0)
+           prout("Any warp speed is adequate.");
+       else {
+           prout("Minimum warp needed is %.2f,", twarp);
+           prout("and we will arrive at stardate %.2f.",
+                 game.state.date+ttime);
+       }
+       if (game.state.remtime < ttime)
+           prout("Unfortunately, the Federation will be destroyed by then.");
+       if (twarp > 6.0)
+           prout("You'll be taking risks at that speed, Captain");
+       if ((isatb==1 && game.state.isy == ix1 && game.state.isx == iy1 &&
+            game.future[FSCDBAS]< ttime+game.state.date)||
+           (game.future[FCDBAS]<ttime+game.state.date && baty==ix1 && batx == iy1))
+           prout("The starbase there will be destroyed by then.");
+       proutn("New warp factor to try? ");
+       if (scan() == IHREAL) {
+           wfl = TRUE;
+           twarp = aaitem;
+           if (twarp<1.0 || twarp > 10.0) {
                huh();
                return;
+           }
        }
-       dist = sqrt(square(iy1-quadx+0.1*(iy2-sectx))+
-                               square(ix1-quady+0.1*(ix2-secty)));
-       wfl = FALSE;
-
-       if (prompt) prout("Answer \"no\" if you don't know the value:");
-       while (TRUE) {
-               chew();
-               proutn("Time or arrival date? ");
-               if (scan()==IHREAL) {
-                       ttime = aaitem;
-                       if (ttime > game.state.date) ttime -= game.state.date; // Actually a star date
-                       if (ttime <= 1e-10 ||
-                               (twarp=(floor(sqrt((10.0*dist)/ttime)*10.0)+1.0)/10.0) > 10) {
-                               prout("We'll never make it, sir.");
-                               chew();
-                               return;
-                       }
-                       if (twarp < 1.0) twarp = 1.0;
-                       break;
-               }
-               chew();
-               proutn("Warp factor? ");
-               if (scan()== IHREAL) {
-                       wfl = TRUE;
-                       twarp = aaitem;
-                       if (twarp<1.0 || twarp > 10.0) {
-                               huh();
-                               return;
-                       }
-                       break;
-               }
-               prout("Captain, certainly you can give me one of these.");
-       }
-       while (TRUE) {
-               chew();
-               ttime = (10.0*dist)/square(twarp);
-               tpower = dist*twarp*twarp*twarp*(shldup+1);
-               if (tpower >= energy) {
-                       prout("Insufficient energy, sir.");
-                       if (shldup==0 || tpower > energy*2.0) {
-                               if (!wfl) return;
-                               proutn("New warp factor to try? ");
-                               if (scan() == IHREAL) {
-                                       wfl = TRUE;
-                                       twarp = aaitem;
-                                       if (twarp<1.0 || twarp > 10.0) {
-                                               huh();
-                                               return;
-                                       }
-                                       continue;
-                               }
-                               else {
-                                       chew();
-                                       skip(1);
-                                       return;
-                               }
-                       }
-                       prout("But if you lower your shields,");
-                       proutn("remaining");
-                       tpower /= 2;
-               }
-               else
-                       proutn("Remaining");
-               prout(" energy will be %.2f.", energy-tpower);
-               if (wfl) {
-                       prout("And we will arrive at stardate %.2f.",
-                               game.state.date+ttime);
-               }
-               else if (twarp==1.0)
-                       prout("Any warp speed is adequate.");
-               else {
-                       prout("Minimum warp needed is %.2f,", twarp);
-                       prout("and we will arrive at stardate %.2f.",
-                               game.state.date+ttime);
-               }
-               if (game.state.remtime < ttime)
-                       prout("Unfortunately, the Federation will be destroyed by then.");
-               if (twarp > 6.0)
-                       prout("You'll be taking risks at that speed, Captain");
-               if ((isatb==1 && game.state.isy == ix1 && game.state.isx == iy1 &&
-                        game.future[FSCDBAS]< ttime+game.state.date)||
-                       (game.future[FCDBAS]<ttime+game.state.date && baty==ix1 && batx == iy1))
-                       prout("The starbase there will be destroyed by then.");
-               proutn("New warp factor to try? ");
-               if (scan() == IHREAL) {
-                       wfl = TRUE;
-                       twarp = aaitem;
-                       if (twarp<1.0 || twarp > 10.0) {
-                               huh();
-                               return;
-                       }
-               }
-               else {
-                       chew();
-                       skip(1);
-                       return;
-               }
+       else {
+           chew();
+           skip(1);
+           return;
        }
+    }
                        
 }
diff --git a/setup.c b/setup.c
index 1fd47b232f6d3b55102bf19ecb1e1be3a768dc22..7509711e16d65755d605532b30e2bd0a43b48b90 100644 (file)
--- a/setup.c
+++ b/setup.c
 #include <sys/stat.h>
 #include "sst.h"
 
-#ifdef __linux__
 static long filelength(int fd) {
 struct stat buf;
     fstat(fd, &buf);
     return buf.st_size;
 }
-#endif
 
-void prelim(void) {
-       skip(2);
-       prout("-SUPER- STAR TREK");
-       skip(1);
+void prelim(void) 
+{
+    skip(2);
+    prout("-SUPER- STAR TREK");
+    skip(1);
 #ifdef __HISTORICAL__
-       prout("Latest update-21 Sept 78");
-       skip(1);
+    prout("Latest update-21 Sept 78");
+    skip(1);
 #endif /* __HISTORICAL__ */
 }
 
-void freeze(int boss) {
-       FILE *fp;
-       int key;
-       if (boss) {
-               strcpy(citem, "emsave.trk");
+void freeze(int boss) 
+{
+    FILE *fp;
+    int key;
+    if (boss) {
+       strcpy(citem, "emsave.trk");
+    }
+    else {
+       if ((key = scan()) == IHEOL) {
+           proutn("File name: ");
+           key = scan();
        }
-       else {
-               if ((key = scan()) == IHEOL) {
-                       proutn("File name: ");
-                       key = scan();
-               }
-               if (key != IHALPHA) {
-                       huh();
-                       return;
-               }
-               chew();
-               if (strchr(citem, '.') == NULL) {
-                       strcat(citem, ".trk");
-               }
+       if (key != IHALPHA) {
+           huh();
+           return;
        }
-       if ((fp = fopen(citem, "wb")) == NULL) {
-               proutn("Can't freeze game as file ");
-               proutn(citem);
-               skip(1);
-               return;
+       chew();
+       if (strchr(citem, '.') == NULL) {
+           strcat(citem, ".trk");
        }
-       strcpy(game.magic, SSTMAGIC);
-       fwrite(&game, sizeof(game), 1, fp);
+    }
+    if ((fp = fopen(citem, "wb")) == NULL) {
+       proutn("Can't freeze game as file ");
+       proutn(citem);
+       skip(1);
+       return;
+    }
+    strcpy(game.magic, SSTMAGIC);
+    fwrite(&game, sizeof(game), 1, fp);
 
-       fclose(fp);
+    fclose(fp);
 
-       /* I hope that's enough! */
+    /* I hope that's enough! */
 }
 
 
-int thaw(void) {
-       FILE *fp;
-        int key;
+int thaw(void) 
+{
+    FILE *fp;
+    int key;
+
+    game.passwd[0] = '\0';
+    if ((key = scan()) == IHEOL) {
+       proutn("File name: ");
+       key = scan();
+    }
+    if (key != IHALPHA) {
+       huh();
+       return 1;
+    }
+    chew();
+    if (strchr(citem, '.') == NULL) {
+       strcat(citem, ".trk");
+    }
+    if ((fp = fopen(citem, "rb")) == NULL) {
+       proutn("Can't find game file ");
+       proutn(citem);
+       skip(1);
+       return 1;
+    }
+    fread(&game, sizeof(game), 1, fp);
+    if (feof(fp) || ftell(fp) != filelength(fileno(fp)) || strcmp(game.magic, SSTMAGIC)) {
+       prout("Game file format is bad, should begin with " SSTMAGIC);
+       skip(1);
+       fclose(fp);
+       return 1;
+    }
+
+    fclose(fp);
+
+    return 0;
+}
 
-       game.passwd[0] = '\0';
-       if ((key = scan()) == IHEOL) {
-               proutn("File name: ");
-               key = scan();
+void abandn(void) 
+{
+    int nb, l;
+
+    chew();
+    if (condit==IHDOCKED) {
+       if (ship!=IHE) {
+           prout("You cannot abandon Ye Faerie Queene.");
+           return;
        }
-       if (key != IHALPHA) {
-               huh();
-               return 1;
+    }
+    else {
+       /* Must take shuttle craft to exit */
+       if (game.damage[DSHUTTL]==-1) {
+           prout("Ye Faerie Queene has no shuttle craft.");
+           return;
        }
-       chew();
-       if (strchr(citem, '.') == NULL) {
-               strcat(citem, ".trk");
+       if (game.damage[DSHUTTL]<0) {
+           prout("Shuttle craft now serving Big Mac's.");
+           return;
        }
-       if ((fp = fopen(citem, "rb")) == NULL) {
-               proutn("Can't find game file ");
-               proutn(citem);
-               skip(1);
-               return 1;
+       if (game.damage[DSHUTTL]>0) {
+           prout("Shuttle craft damaged.");
+           return;
        }
-       fread(&game, sizeof(game), 1, fp);
-       if (feof(fp) || ftell(fp) != filelength(fileno(fp)) || strcmp(game.magic, SSTMAGIC)) {
-               prout("Game file format is bad, should begin with " SSTMAGIC);
-               skip(1);
-               fclose(fp);
-               return 1;
+       if (landed==1) {
+           prout("You must be aboard the Enterprise.");
+           return;
        }
-
-       fclose(fp);
-
-        return 0;
-}
-
-void abandn(void) {
-       int nb, l;
-
-       chew();
-       if (condit==IHDOCKED) {
-               if (ship!=IHE) {
-                       prout("You cannot abandon Ye Faerie Queene.");
-                       return;
-               }
+       if (iscraft!=1) {
+           prout("Shuttle craft not currently available.");
+           return;
        }
-       else {
-               /* Must take shuttle craft to exit */
-               if (game.damage[DSHUTTL]==-1) {
-                       prout("Ye Faerie Queene has no shuttle craft.");
-                       return;
-               }
-               if (game.damage[DSHUTTL]<0) {
-                       prout("Shuttle craft now serving Big Mac's.");
-                       return;
-               }
-               if (game.damage[DSHUTTL]>0) {
-                       prout("Shuttle craft damaged.");
-                       return;
-               }
-               if (landed==1) {
-                       prout("You must be aboard the Enterprise.");
-                       return;
-               }
-               if (iscraft!=1) {
-                       prout("Shuttle craft not currently available.");
-                       return;
-               }
-               /* Print abandon ship messages */
-               skip(1);
-               prouts("***ABANDON SHIP!  ABANDON SHIP!");
-               skip(1);
-               prouts("***ALL HANDS ABANDON SHIP!");
-               skip(2);
-               prout("Captain and crew escape in shuttle craft.");
-               prout("Remainder of ship's complement beam down");
-               prout("to nearest habitable planet.");
-               if (game.state.rembase==0) {
-                       /* Ops! no place to go... */
-                       finish(FABANDN);
-                       return;
-               }
-               /* If at least one base left, give 'em the Faerie Queene */
-               skip(1);
-               icrystl = 0; /* crystals are lost */
-               nprobes = 0; /* No probes */
-               prout("You are captured by Klingons and released to");
-               prout("the Federation in a prisoner-of-war exchange.");
-               nb = Rand()*game.state.rembase+1;
-               /* Set up quadrant and position FQ adjacient to base */
-               if (quadx!=game.state.baseqx[nb] || quady!=game.state.baseqy[nb]) {
-                       quadx = game.state.baseqx[nb];
-                       quady = game.state.baseqy[nb];
-                       sectx = secty = 5;
-                       newqad(1);
-               }
-               for (;;) {
-                       /* position next to base by trial and error */
-                       game.quad[sectx][secty] = IHDOT;
-                       for (l = 1; l <= QUADSIZE; l++) {
-                               sectx = 3.0*Rand() - 1.0 + basex;
-                               secty = 3.0*Rand() - 1.0 + basey;
-                               if (sectx >= 1 && sectx <= QUADSIZE &&
-                                       secty >= 1 && secty <= QUADSIZE &&
-                                       game.quad[sectx][secty] == IHDOT) break;
-                       }
-                       if (l < QUADSIZE+1) break; /* found a spot */
-                       sectx=QUADSIZE/2;
-                       secty=QUADSIZE/2;
-                       newqad(1);
-               }
+       /* Print abandon ship messages */
+       skip(1);
+       prouts("***ABANDON SHIP!  ABANDON SHIP!");
+       skip(1);
+       prouts("***ALL HANDS ABANDON SHIP!");
+       skip(2);
+       prout("Captain and crew escape in shuttle craft.");
+       prout("Remainder of ship's complement beam down");
+       prout("to nearest habitable planet.");
+       if (game.state.rembase==0) {
+           /* Ops! no place to go... */
+           finish(FABANDN);
+           return;
        }
-       /* Get new commission */
-       game.quad[sectx][secty] = ship = IHF;
-       prout("Starfleet puts you in command of another ship,");
-       prout("the Faerie Queene, which is antiquated but,");
-       prout("still useable.");
-       if (icrystl!=0) prout("The dilithium crystals have been moved.");
-       imine=0;
-       iscraft=0; /* Gallileo disappears */
-       /* Resupply ship */
-       condit=IHDOCKED;
-       for (l = 1; l <= NDEVICES; l++) game.damage[l] = 0.0;
-       game.damage[DSHUTTL] = -1;
-       energy = inenrg = 3000.0;
-       shield = inshld = 1250.0;
-       torps = intorps = 6;
-       lsupres=inlsr=3.0;
-       shldup=0;
-       warpfac=5.0;
-       wfacsq=25.0;
-       return;
+       /* If at least one base left, give 'em the Faerie Queene */
+       skip(1);
+       icrystl = 0; /* crystals are lost */
+       nprobes = 0; /* No probes */
+       prout("You are captured by Klingons and released to");
+       prout("the Federation in a prisoner-of-war exchange.");
+       nb = Rand()*game.state.rembase+1;
+       /* Set up quadrant and position FQ adjacient to base */
+       if (quadx!=game.state.baseqx[nb] || quady!=game.state.baseqy[nb]) {
+           quadx = game.state.baseqx[nb];
+           quady = game.state.baseqy[nb];
+           sectx = secty = 5;
+           newqad(1);
+       }
+       for (;;) {
+           /* position next to base by trial and error */
+           game.quad[sectx][secty] = IHDOT;
+           for (l = 1; l <= QUADSIZE; l++) {
+               sectx = 3.0*Rand() - 1.0 + basex;
+               secty = 3.0*Rand() - 1.0 + basey;
+               if (sectx >= 1 && sectx <= QUADSIZE &&
+                   secty >= 1 && secty <= QUADSIZE &&
+                   game.quad[sectx][secty] == IHDOT) break;
+           }
+           if (l < QUADSIZE+1) break; /* found a spot */
+           sectx=QUADSIZE/2;
+           secty=QUADSIZE/2;
+           newqad(1);
+       }
+    }
+    /* Get new commission */
+    game.quad[sectx][secty] = ship = IHF;
+    prout("Starfleet puts you in command of another ship,");
+    prout("the Faerie Queene, which is antiquated but,");
+    prout("still useable.");
+    if (icrystl!=0) prout("The dilithium crystals have been moved.");
+    imine=0;
+    iscraft=0; /* Gallileo disappears */
+    /* Resupply ship */
+    condit=IHDOCKED;
+    for (l = 1; l <= NDEVICES; l++) game.damage[l] = 0.0;
+    game.damage[DSHUTTL] = -1;
+    energy = inenrg = 3000.0;
+    shield = inshld = 1250.0;
+    torps = intorps = 6;
+    lsupres=inlsr=3.0;
+    shldup=0;
+    warpfac=5.0;
+    wfacsq=25.0;
+    return;
 }
        
-void setup(int needprompt) {
-       int i,j, krem, klumper;
-       int ix, iy;
+void setup(int needprompt) 
+{
+    int i,j, krem, klumper;
+    int ix, iy;
 #ifdef DEBUG
-       idebug = 0;
+    idebug = 0;
 #endif
-       //  Decide how many of everything
-       if (choose(needprompt)) return; // frozen game
-       // Prepare the Enterprise
-        alldone = gamewon = 0;
-       ship = IHE;
-       energy = inenrg = 5000.0;
-       shield = inshld = 2500.0;
-       shldchg = shldup = 0;
-       inlsr = 4.0;
-       lsupres = 4.0;
-       iran8(&quadx, &quady);
-       iran10(&sectx, &secty);
-       torps = intorps = 10;
-       nprobes = (int)(3.0*Rand() + 2.0);      /* Give them 2-4 of these wonders */
-       warpfac = 5.0;
-       wfacsq = warpfac * warpfac;
-       for (i=0; i <= NDEVICES; i++) game.damage[i] = 0.0;
-       // Set up assorted game parameters
-       batx = baty = 0;
-       game.state.date = indate = 100.0*(int)(31.0*Rand()+20.0);
-       game.state.killk = game.state.killc = nkinks = nhelp = resting = casual = game.state.nromkl = 0;
-       isatb = iscate = imine = icrystl = icraft = game.state.nsckill = game.state.nplankl = 0;
-        game.state.starkl = game.state.basekl = 0;
-       iscraft = 1;
-       landed = -1;
-       alive = 1;
-       docfac = 0.25;
-       for (i = 1; i <= GALSIZE; i++)
-               for (j = 1; j <= GALSIZE; j++) game.state.newstuf[i][j] = game.starch[i][j] = 0;
-       // Initialize times for extraneous events
-       game.future[FSNOVA] = game.state.date + expran(0.5 * intime);
-       game.future[FTBEAM] = game.state.date + expran(1.5 * (intime / game.state.remcom));
-       game.future[FSNAP] = game.state.date + 1.0 + Rand(); // Force an early snapshot
-       game.future[FBATTAK] = game.state.date + expran(0.3*intime);
-       game.future[FCDBAS] = 1e30;
-       game.future[FSCMOVE] = game.state.nscrem ? game.state.date+0.2777 : 1e30;
-       game.future[FSCDBAS] = 1e30;
-       game.future[FDSPROB] = 1e30;
-       // Starchart is functional
-       stdamtim = 1e30;
-       // Put stars in the galaxy
-       instar = 0;
-       for (i=1; i<=GALSIZE; i++)
-               for (j=1; j<=GALSIZE; j++) {
-                       int k = Rand()*9.0 + 1.0;
-                       instar += k;
-                       game.state.galaxy[i][j] = k * STAR_PLACE;
-               }
-       // Locate star bases in galaxy
-       for (i = 1; i <= inbase; i++) {
-               int contflag;
-               do {
-                       do iran8(&ix, &iy);
-                       while (game.state.galaxy[ix][iy] >= BASE_PLACE);
-                       contflag = FALSE;
-                       for (j = i-1; j > 0; j--) {
-                               /* Improved placement algorithm to spread out bases */
-                               double distq = square(ix-game.state.baseqx[j]) + square(iy-game.state.baseqy[j]);
-                               if (distq < 6.0*(BASEMAX-inbase) && Rand() < 0.75) {
-                                       contflag = TRUE;
+    //  Decide how many of everything
+    if (choose(needprompt)) return; // frozen game
+    // Prepare the Enterprise
+    alldone = gamewon = 0;
+    ship = IHE;
+    energy = inenrg = 5000.0;
+    shield = inshld = 2500.0;
+    shldchg = shldup = 0;
+    inlsr = 4.0;
+    lsupres = 4.0;
+    iran(GALSIZE, &quadx, &quady);
+    iran(QUADSIZE, &sectx, &secty);
+    torps = intorps = 10;
+    nprobes = (int)(3.0*Rand() + 2.0); /* Give them 2-4 of these wonders */
+    warpfac = 5.0;
+    wfacsq = warpfac * warpfac;
+    for (i=0; i <= NDEVICES; i++) game.damage[i] = 0.0;
+    // Set up assorted game parameters
+    batx = baty = 0;
+    game.state.date = indate = 100.0*(int)(31.0*Rand()+20.0);
+    game.state.killk = game.state.killc = nkinks = nhelp = resting = casual = game.state.nromkl = 0;
+    isatb = iscate = imine = icrystl = icraft = game.state.nsckill = game.state.nplankl = 0;
+    game.state.starkl = game.state.basekl = 0;
+    iscraft = 1;
+    landed = -1;
+    alive = 1;
+    docfac = 0.25;
+    for (i = 1; i <= GALSIZE; i++)
+       for (j = 1; j <= GALSIZE; j++) game.state.newstuf[i][j] = game.starch[i][j] = 0;
+    // Initialize times for extraneous events
+    game.future[FSNOVA] = game.state.date + expran(0.5 * intime);
+    game.future[FTBEAM] = game.state.date + expran(1.5 * (intime / game.state.remcom));
+    game.future[FSNAP] = game.state.date + 1.0 + Rand(); // Force an early snapshot
+    game.future[FBATTAK] = game.state.date + expran(0.3*intime);
+    game.future[FCDBAS] = 1e30;
+    game.future[FSCMOVE] = game.state.nscrem ? game.state.date+0.2777 : 1e30;
+    game.future[FSCDBAS] = 1e30;
+    game.future[FDSPROB] = 1e30;
+    // Starchart is functional
+    stdamtim = 1e30;
+    // Put stars in the galaxy
+    instar = 0;
+    for (i=1; i<=GALSIZE; i++)
+       for (j=1; j<=GALSIZE; j++) {
+           int k = Rand()*9.0 + 1.0;
+           instar += k;
+           game.state.galaxy[i][j] = k * STAR_PLACE;
+       }
+    // Locate star bases in galaxy
+    for (i = 1; i <= inbase; i++) {
+       int contflag;
+       do {
+           do iran(GALSIZE, &ix, &iy);
+           while (BASES(game.state.galaxy[ix][iy]));
+           contflag = FALSE;
+           for (j = i-1; j > 0; j--) {
+               /* Improved placement algorithm to spread out bases */
+               double distq = square(ix-game.state.baseqx[j]) + square(iy-game.state.baseqy[j]);
+               if (distq < 6.0*(BASEMAX-inbase) && Rand() < 0.75) {
+                   contflag = TRUE;
 #ifdef DEBUG
-                                       proutn("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);
+                   proutn("DEBUG: Abandoning base #%d at %d-%d\n", i, ix, iy);
 #endif
-                                       break;
-                               }
+                   break;
+               }
 #ifdef DEBUG
-                               else if (distq < 6.0 * (BASEMAX-inbase)) {
-                                       proutn("DEBUG: saving base #%d, close to #%d\n", i, j);
-                               }
+               else if (distq < 6.0 * (BASEMAX-inbase)) {
+                   proutn("DEBUG: saving base #%d, close to #%d\n", i, j);
+               }
 #endif
-                       }
-               } while (contflag);
+           }
+       } while (contflag);
                        
-               game.state.baseqx[i] = ix;
-               game.state.baseqy[i] = iy;
-               game.starch[ix][iy] = CHART_UNKNOWN;
-               game.state.galaxy[ix][iy] += BASE_PLACE;
-       }
-       // Position ordinary Klingon Battle Cruisers
-       krem = inkling - incom - game.state.nscrem;
-       klumper = 0.25*skill*(9.0-length)+1.0;
-       if (klumper > 9) klumper = 9; // Can't have more than 9 in quadrant
-       do {
-               double r = Rand();
-               int klump = (1.0 - r*r)*klumper;
-               if (klump > krem) klump = krem;
-               krem -= klump;
-               klump *= 100;
-               do iran8(&ix, &iy);
-               while (game.state.galaxy[ix][iy] + klump >= SUPERNOVA_PLACE);
-               game.state.galaxy[ix][iy] += klump;
-       } while (krem > 0);
-       // Position Klingon Commander Ships
+       game.state.baseqx[i] = ix;
+       game.state.baseqy[i] = iy;
+       game.starch[ix][iy] = CHART_UNKNOWN;
+       game.state.galaxy[ix][iy] += BASE_PLACE;
+    }
+    // Position ordinary Klingon Battle Cruisers
+    krem = inkling - incom - game.state.nscrem;
+    klumper = 0.25*skill*(9.0-length)+1.0;
+    if (klumper > 9) klumper = 9; // Can't have more than 9 in quadrant
+    do {
+       double r = Rand();
+       int klump = (1.0 - r*r)*klumper;
+       if (klump > krem) klump = krem;
+       krem -= klump;
+       klump *= KLINGON_PLACE;
+       do iran(GALSIZE, &ix, &iy);
+       while (game.state.galaxy[ix][iy] + klump >= SUPERNOVA_PLACE);
+       game.state.galaxy[ix][iy] += klump;
+    } while (krem > 0);
+    // Position Klingon Commander Ships
 #ifdef DEBUG
-       klumper = 1;
+    klumper = 1;
 #endif
-       for (i = 1; i <= incom; i++) {
-               do {
-                       do { /* IF debugging, put commanders by bases, always! */
+    for (i = 1; i <= incom; i++) {
+       do {
+           do { /* IF debugging, put commanders by bases, always! */
 #ifdef DEBUG
-                               if (idebug && klumper <= inbase) {
-                                       ix = game.state.baseqx[klumper];
-                                       iy = game.state.baseqy[klumper];
-                                       klumper++;
-                               }
-                               else
+               if (idebug && klumper <= inbase) {
+                   ix = game.state.baseqx[klumper];
+                   iy = game.state.baseqy[klumper];
+                   klumper++;
+               }
+               else
 #endif
-                                       iran8(&ix, &iy);
-                       }
-                       while ((game.state.galaxy[ix][iy] < 99 && Rand() < 0.75)||
-                                  game.state.galaxy[ix][iy]>899);
-                       // check for duplicate
-                       for (j = 1; j < i; j++)
-                               if (game.state.cx[j]==ix && game.state.cy[j]==iy) break;
-               } while (j < i);
-               game.state.galaxy[ix][iy] += ENEMY_PLACE;
-               game.state.cx[i] = ix;
-               game.state.cy[i] = iy;
-       }
-       // Locate planets in galaxy
-       for (i = 0; i < inplan; i++) {
-               do iran8(&ix, &iy);
-               while (game.state.newstuf[ix][iy] > 0);
-               game.state.newstuf[ix][iy] = 1;
-               game.state.plnets[i].x = ix;
-               game.state.plnets[i].y = iy;
-               game.state.plnets[i].pclass = Rand()*3.0; // Planet class M N or O
-               game.state.plnets[i].crystals = 1.5*Rand();             // 1 in 3 chance of crystals
-               game.state.plnets[i].known = unknown;
-       }
-       // Locate Romulans
-       for (i = 1; i <= game.state.nromrem; i++) {
-               iran8(&ix, &iy);
-               game.state.newstuf[ix][iy] += ROMULAN_PLACE;
-       }
-       // Locate the Super Commander
-       if (game.state.nscrem > 0) {
-               do iran8(&ix, &iy);
-               while (game.state.galaxy[ix][iy] >= 900);
-               game.state.isx = ix;
-               game.state.isy = iy;
-               game.state.galaxy[ix][iy] += ENEMY_PLACE;
-       }
-       // Place thing (in tournament game, thingx == -1, don't want one!)
-       if (thingx != -1) {
-               iran8(&thingx, &thingy);
-       }
-       else {
-               thingx = thingy = 0;
-       }
+                   iran(GALSIZE, &ix, &iy);
+           }
+           while ((game.state.galaxy[ix][iy] <= KLINGON_PLACE && Rand() < 0.75)||
+                  NOEXIT(game.state.galaxy[ix][iy]));
+           // check for duplicate
+           for (j = 1; j < i; j++)
+               if (game.state.cx[j]==ix && game.state.cy[j]==iy) break;
+       } while (j < i);
+       game.state.galaxy[ix][iy] += KLINGON_PLACE;
+       game.state.cx[i] = ix;
+       game.state.cy[i] = iy;
+    }
+    // Locate planets in galaxy
+    for (i = 0; i < inplan; i++) {
+       do iran(GALSIZE, &ix, &iy);
+       while (game.state.newstuf[ix][iy] > 0);
+       game.state.newstuf[ix][iy] = 1;
+       game.state.plnets[i].x = ix;
+       game.state.plnets[i].y = iy;
+       game.state.plnets[i].pclass = Rand()*3.0; // Planet class M N or O
+       game.state.plnets[i].crystals = 1.5*Rand();             // 1 in 3 chance of crystals
+       game.state.plnets[i].known = unknown;
+    }
+    // Locate Romulans
+    for (i = 1; i <= game.state.nromrem; i++) {
+       iran(GALSIZE, &ix, &iy);
+       game.state.newstuf[ix][iy] += ROMULAN_PLACE;
+    }
+    // Locate the Super Commander
+    if (game.state.nscrem > 0) {
+       do iran(GALSIZE, &ix, &iy);
+       while (game.state.galaxy[ix][iy] >= 900);
+       game.state.isx = ix;
+       game.state.isy = iy;
+       game.state.galaxy[ix][iy] += KLINGON_PLACE;
+    }
+    // Place thing (in tournament game, thingx == -1, don't want one!)
+    if (thingx != -1) {
+       iran(GALSIZE, &thingx, &thingy);
+    }
+    else {
+       thingx = thingy = 0;
+    }
 
 //     idate = date;
-       skip(2);
-       game.state.snap = 0;
+    skip(2);
+    game.state.snap = 0;
                
-       if (skill == 1) {
-               prout("It is stardate %d. The Federation is being attacked by",
-                          (int)game.state.date);
-               prout("a deadly Klingon invasion force. As captain of the United");
-               prout("Starship U.S.S. Enterprise, it is your mission to seek out");
-               prout("and destroy this invasion force of %d battle cruisers.",
-                          inkling);
-               prout("You have an initial allotment of %d stardates to complete", (int)intime);
-               prout("your mission.  As you proceed you may be given more time.");
-               prout("");
-               prout("You will have %d supporting starbases.", inbase);
-               proutn("Starbase locations-  ");
-       }
-       else {
-               prout("Stardate %d.", (int)game.state.date);
-               prout("");
-               prout("%d Klingons.", inkling);
-               prout("An unknown number of Romulans.");
-               if (game.state.nscrem) prout("and one (GULP) Super-Commander.");
-                       prout("%d stardates.",(int)intime);
-                       proutn("%d starbases in ", inbase);
-       }
-       for (i = 1; i <= inbase; i++) {
-               proutn(cramlc(0, game.state.baseqx[i], game.state.baseqy[i]));
-               proutn("  ");
-       }
-       skip(2);
-       proutn("The Enterprise is currently in ");
-       proutn(cramlc(quadrant, quadx, quady));
-       proutn(" ");
-        proutn(cramlc(sector, sectx, secty));
-       skip(2);
-       prout("Good Luck!");
-       if (game.state.nscrem) prout("  YOU'LL NEED IT.");
-        waitfor();
-       newqad(0);
-        if (nenhere-iqhere-ithere) shldup=1.0;
-       if (neutz) attack(0);   // bad luck to start in a Romulan Neutral Zone
+    if (skill == SKILL_NOVICE) {
+       prout("It is stardate %d. The Federation is being attacked by",
+             (int)game.state.date);
+       prout("a deadly Klingon invasion force. As captain of the United");
+       prout("Starship U.S.S. Enterprise, it is your mission to seek out");
+       prout("and destroy this invasion force of %d battle cruisers.",
+             inkling);
+       prout("You have an initial allotment of %d stardates to complete", (int)intime);
+       prout("your mission.  As you proceed you may be given more time.");
+       prout("");
+       prout("You will have %d supporting starbases.", inbase);
+       proutn("Starbase locations-  ");
+    }
+    else {
+       prout("Stardate %d.", (int)game.state.date);
+       prout("");
+       prout("%d Klingons.", inkling);
+       prout("An unknown number of Romulans.");
+       if (game.state.nscrem) prout("and one (GULP) Super-Commander.");
+       prout("%d stardates.",(int)intime);
+       proutn("%d starbases in ", inbase);
+    }
+    for (i = 1; i <= inbase; i++) {
+       proutn(cramlc(0, game.state.baseqx[i], game.state.baseqy[i]));
+       proutn("  ");
+    }
+    skip(2);
+    proutn("The Enterprise is currently in ");
+    proutn(cramlc(quadrant, quadx, quady));
+    proutn(" ");
+    proutn(cramlc(sector, sectx, secty));
+    skip(2);
+    prout("Good Luck!");
+    if (game.state.nscrem) prout("  YOU'LL NEED IT.");
+    waitfor();
+    newqad(0);
+    if (nenhere-iqhere-ithere) shldup=1.0;
+    if (neutz) attack(0);      // bad luck to start in a Romulan Neutral Zone
 }
 
-void randomize(void) {
-       srand((int)time(NULL));
+void randomize(void) 
+{
+    srand((int)time(NULL));
 }
 
-int choose(int needprompt) {
-        while (TRUE) {
+int choose(int needprompt) 
+{
+    while (TRUE) {
        tourn = 0;
        thawed = 0;
-       skill = 0;
+       skill = SKILL_NONE;
        length = 0;
-               if (needprompt) /* Can start with command line options */
-                        proutn("Would you like a regular, tournament, or saved game? ");
-               scan();
-               if (strlen(citem)==0) continue; // Try again
-               if (isit("tournament")) {
-                       while (scan() == IHEOL) {
-                               proutn("Type in tournament number-");
-                       }
-                       if (aaitem == 0) {
-                               chew();
-                               continue; // We don't want a blank entry
-                       }
-                       tourn = (int)aaitem;
-                       thingx = -1;
-                       srand((unsigned int)(int)aaitem);
-                       break;
-               }
-               if (isit("saved") || isit("frozen")) {
-                        if (thaw()) continue;
-                       chew();
-                       if (*game.passwd==0) continue;
-                       if (!alldone) thawed = 1; // No plaque if not finished
-                        report();
-                        waitfor();
-                       return TRUE;
-               }
-                if (isit("regular")) break;
+       if (needprompt) /* Can start with command line options */
+           proutn("Would you like a regular, tournament, or saved game? ");
+       scan();
+       if (strlen(citem)==0) continue; // Try again
+       if (isit("tournament")) {
+           while (scan() == IHEOL) {
+               proutn("Type in tournament number-");
+           }
+           if (aaitem == 0) {
+               chew();
+               continue; // We don't want a blank entry
+           }
+           tourn = (int)aaitem;
+           thingx = -1;
+           srand((unsigned int)(int)aaitem);
+           break;
+       }
+       if (isit("saved") || isit("frozen")) {
+           if (thaw()) continue;
+           chew();
+           if (*game.passwd==0) continue;
+           if (!alldone) thawed = 1; // No plaque if not finished
+           report();
+           waitfor();
+           return TRUE;
+       }
+       if (isit("regular")) break;
+       proutn("What is \"");
+       proutn(citem);
+       prout("\"?");
+       chew();
+    }
+    while (length==0 || skill==SKILL_NONE) {
+       if (scan() == IHALPHA) {
+           if (isit("short")) length = 1;
+           else if (isit("medium")) length = 2;
+           else if (isit("long")) length = 4;
+           else if (isit("novice")) skill = SKILL_NOVICE;
+           else if (isit("fair")) skill = SKILL_FAIR;
+           else if (isit("good")) skill = SKILL_GOOD;
+           else if (isit("expert")) skill = SKILL_EXPERT;
+           else if (isit("emeritus")) skill = SKILL_EMERITUS;
+           else {
                proutn("What is \"");
                proutn(citem);
                prout("\"?");
-               chew();
+           }
        }
-       while (length==0 || skill==0) {
-               if (scan() == IHALPHA) {
-                       if (isit("short")) length = 1;
-                       else if (isit("medium")) length = 2;
-                       else if (isit("long")) length = 4;
-                       else if (isit("novice")) skill = 1;
-                       else if (isit("fair")) skill = 2;
-                       else if (isit("good")) skill = 3;
-                       else if (isit("expert")) skill = 4;
-                       else if (isit("emeritus")) skill = 5;
-                       else {
-                               proutn("What is \"");
-                               proutn(citem);
-                               prout("\"?");
-                       }
-               }
-               else {
-                       chew();
-                       if (length==0) proutn("Would you like a Short, Medium, or Long game? ");
-                       else if (skill == 0) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player? ");
-               }
+       else {
+           chew();
+           if (length==0) proutn("Would you like a Short, Medium, or Long game? ");
+           else if (skill == SKILL_NONE) proutn("Are you a Novice, Fair, Good, Expert, or Emeritus player? ");
        }
-       setpassword();
+    }
+    setpassword();
 #ifdef DEBUG
-       if (strcmp(game.passwd, "debug")==0) idebug = 1;
+    if (strcmp(game.passwd, "debug")==0) idebug = 1;
 #endif
 
-       // Use parameters to generate initial values of things
-       damfac = 0.5 * skill;
-       game.state.rembase = 3.0*Rand()+2.0;
-       inbase = game.state.rembase;
-       inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();
-       game.state.nromrem = (2.0+Rand())*skill;
-       game.state.nscrem = (skill > 2? 1 : 0);
-       game.state.remtime = 7.0 * length;
-       intime = game.state.remtime;
-       game.state.remkl = 2.0*intime*((skill+1 - 2*Rand())*skill*0.1+.15);
-       inkling = game.state.remkl;
-       incom = skill + 0.0625*inkling*Rand();
-       game.state.remcom= min(10, incom);
-       incom = game.state.remcom;
-       game.state.remres = (inkling+4*incom)*intime;
-       inresor = game.state.remres;
-       if (inkling > 50) {
-               inbase = (game.state.rembase += 1);
-       }
-       return FALSE;
+    // Use parameters to generate initial values of things
+    damfac = 0.5 * skill;
+    game.state.rembase = 3.0*Rand()+2.0;
+    inbase = game.state.rembase;
+    inplan = (PLNETMAX/2) + (PLNETMAX/2+1)*Rand();
+    game.state.nromrem = (2.0+Rand())*skill;
+    game.state.nscrem = (skill > SKILL_FAIR ? 1 : 0);
+    game.state.remtime = 7.0 * length;
+    intime = game.state.remtime;
+    game.state.remkl = 2.0*intime*((skill+1 - 2*Rand())*skill*0.1+.15);
+    inkling = game.state.remkl;
+    incom = skill + 0.0625*inkling*Rand();
+    game.state.remcom= min(10, incom);
+    incom = game.state.remcom;
+    game.state.remres = (inkling+4*incom)*intime;
+    inresor = game.state.remres;
+    if (inkling > 50) {
+       inbase = (game.state.rembase += 1);
+    }
+    return FALSE;
 }
 
-void dropin(int iquad, int *ix, int *iy) {
-       do iran10(ix, iy);
-       while (game.quad[*ix][*iy] != IHDOT);
-       game.quad[*ix][*iy] = iquad;
+void dropin(int iquad, int *ix, int *iy) 
+{
+    do iran(QUADSIZE, ix, iy);
+    while (game.quad[*ix][*iy] != IHDOT);
+    game.quad[*ix][*iy] = iquad;
 }
 
-void newcnd(void) {
-       condit = IHGREEN;
-       if (energy < 1000.0) condit = IHYELLOW;
-       if (game.state.galaxy[quadx][quady] >= ENEMY_PLACE || game.state.newstuf[quadx][quady] > 9)
-               condit = IHRED;
-        if (!alive) condit=IHDEAD;
+void newcnd(void) 
+{
+    condit = IHGREEN;
+    if (energy < 1000.0) condit = IHYELLOW;
+    if (game.state.galaxy[quadx][quady] >= KLINGON_PLACE || game.state.newstuf[quadx][quady] >= ROMULAN_PLACE)
+       condit = IHRED;
+    if (!alive) condit=IHDEAD;
 }
 
 
-void newqad(int shutup) {
-       int quadnum = game.state.galaxy[quadx][quady];
-       int newnum = game.state.newstuf[quadx][quady];
-       int i, j, ix, iy, nplan;
-
-       iattak = 1;
-       justin = 1;
-       basex = basey = 0;
-       klhere = 0;
-       comhere = 0;
-       plnetx = plnety = 0;
-       ishere = 0;
-       irhere = 0;
-       iplnet = 0;
-       nenhere = 0;
-       neutz = 0;
-       inorbit = 0;
-       landed = -1;
-       ientesc = 0;
-       ithere = 0;
-        iqhere=0;
-        iqengry=0;
-       iseenit = 0;
-       if (iscate) {
-               // Attempt to escape Super-commander, so tbeam back!
-               iscate = 0;
-               ientesc = 1;
-       }
-       // Clear quadrant
-       for (i=1; i <= QUADSIZE; i++)
-               for (j=1; j <= QUADSIZE; j++) game.quad[i][j] = IHDOT;
-       // cope with supernova
-       if (quadnum > 999) {
-               return;
+void newqad(int shutup) 
+{
+    int quadnum = game.state.galaxy[quadx][quady];
+    int newnum = game.state.newstuf[quadx][quady];
+    int i, j, ix, iy, nplan;
+
+    iattak = 1;
+    justin = 1;
+    basex = basey = 0;
+    klhere = 0;
+    comhere = 0;
+    plnetx = plnety = 0;
+    ishere = 0;
+    irhere = 0;
+    iplnet = 0;
+    nenhere = 0;
+    neutz = 0;
+    inorbit = 0;
+    landed = -1;
+    ientesc = 0;
+    ithere = 0;
+    iqhere=0;
+    iqengry=0;
+    iseenit = 0;
+    if (iscate) {
+       // Attempt to escape Super-commander, so tbeam back!
+       iscate = 0;
+       ientesc = 1;
+    }
+    // Clear quadrant
+    for (i=1; i <= QUADSIZE; i++)
+       for (j=1; j <= QUADSIZE; j++) game.quad[i][j] = IHDOT;
+    // cope with supernova
+    if (quadnum >= SUPERNOVA_PLACE) {
+       return;
+    }
+    klhere = KLINGONS(quadnum);
+    irhere = ROMULANS(newnum);
+    nplan = newnum%10;
+    nenhere = klhere + irhere;
+
+    // Position Starship
+    game.quad[sectx][secty] = ship;
+
+    if (quadnum >= KLINGON_PLACE) {
+       // Position ordinary Klingons
+       quadnum -= KLINGON_PLACE*klhere;
+       for (i = 1; i <= klhere; i++) {
+           dropin(IHK, &ix, &iy);
+           game.kx[i] = ix;
+           game.ky[i] = iy;
+           game.kdist[i] = game.kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
+           game.kpower[i] = Rand()*150.0 +300.0 +25.0*skill;
        }
-       klhere = quadnum/ENEMY_PLACE;
-       irhere = newnum/ROMULAN_PLACE;
-       nplan = newnum%10;
-       nenhere = klhere + irhere;
-
-       // Position Starship
-       game.quad[sectx][secty] = ship;
-
-       if (quadnum >= ENEMY_PLACE) {
-               // Position ordinary Klingons
-               quadnum -= ENEMY_PLACE*klhere;
-               for (i = 1; i <= klhere; i++) {
-                       dropin(IHK, &ix, &iy);
-                       game.kx[i] = ix;
-                       game.ky[i] = iy;
-                       game.kdist[i] = game.kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
-                       game.kpower[i] = Rand()*150.0 +300.0 +25.0*skill;
-               }
-               // If we need a commander, promote a Klingon
-               for (i = 1; i <= game.state.remcom ; i++) 
-                       if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;
+       // If we need a commander, promote a Klingon
+       for (i = 1; i <= game.state.remcom ; i++) 
+           if (game.state.cx[i]==quadx && game.state.cy[i]==quady) break;
                        
-               if (i <= game.state.remcom) {
-                       game.quad[ix][iy] = IHC;
-                       game.kpower[klhere] = 950.0+400.0*Rand()+50.0*skill;
-                       comhere = 1;
-               }
-
-               // If we need a super-commander, promote a Klingon
-               if (quadx == game.state.isx && quady == game.state.isy) {
-                       game.quad[game.kx[1]][game.ky[1]] = IHS;
-                       game.kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;
-                        iscate = game.state.remkl>1;
-                       ishere = 1;
-               }
-       }
-       // Put in Romulans if needed
-       for (i = klhere+1; i <= nenhere; i++) {
-               dropin(IHR, &ix, &iy);
-               game.kx[i] = ix;
-               game.ky[i] = iy;
-               game.kdist[i] = game.kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
-               game.kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;
+       if (i <= game.state.remcom) {
+           game.quad[ix][iy] = IHC;
+           game.kpower[klhere] = 950.0+400.0*Rand()+50.0*skill;
+           comhere = 1;
        }
-       // If quadrant needs a starbase, put it in
-       if (quadnum >= BASE_PLACE) {
-               quadnum -= BASE_PLACE;
-               dropin(IHB, &basex, &basey);
+
+       // If we need a super-commander, promote a Klingon
+       if (quadx == game.state.isx && quady == game.state.isy) {
+           game.quad[game.kx[1]][game.ky[1]] = IHS;
+           game.kpower[1] = 1175.0 + 400.0*Rand() + 125.0*skill;
+           iscate = game.state.remkl>1;
+           ishere = 1;
        }
+    }
+    // Put in Romulans if needed
+    for (i = klhere+1; i <= nenhere; i++) {
+       dropin(IHR, &ix, &iy);
+       game.kx[i] = ix;
+       game.ky[i] = iy;
+       game.kdist[i] = game.kavgd[i] = sqrt(square(sectx-ix) + square(secty-iy));
+       game.kpower[i] = Rand()*400.0 + 450.0 + 50.0*skill;
+    }
+    // If quadrant needs a starbase, put it in
+    if (quadnum >= BASE_PLACE) {
+       quadnum -= BASE_PLACE;
+       dropin(IHB, &basex, &basey);
+    }
        
-       if (nplan) {
-               // If quadrant needs a planet, put it in
-               for (i=0; i < inplan; i++)
-                       if (game.state.plnets[i].x == quadx && game.state.plnets[i].y == quady) break;
-               if (i < inplan) {
-                       iplnet = i;
-                       dropin(IHP, &plnetx, &plnety);
-               }
+    if (nplan) {
+       // If quadrant needs a planet, put it in
+       for (i=0; i < inplan; i++)
+           if (game.state.plnets[i].x == quadx && game.state.plnets[i].y == quady) break;
+       if (i < inplan) {
+           iplnet = i;
+           dropin(IHP, &plnetx, &plnety);
        }
-       // Check for condition
-       newcnd();
-       // And finally the stars
-       for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);
-
-       // Check for RNZ
-       if (irhere > 0 && klhere == 0) {
-               neutz = 1;
-               if (game.damage[DRADIO] <= 0.0) {
-                       skip(1);
-                       prout("LT. Uhura- \"Captain, an urgent message.");
-                       prout("  I'll put it on audio.\"  CLICK");
-                       skip(1);
-                       prout("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.");
-                       prout("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!");
-               }
+    }
+    // Check for condition
+    newcnd();
+    // And finally the stars
+    for (i = 1; i <= quadnum; i++) dropin(IHSTAR, &ix, &iy);
+
+    // Check for RNZ
+    if (irhere > 0 && klhere == 0) {
+       neutz = 1;
+       if (game.damage[DRADIO] <= 0.0) {
+           skip(1);
+           prout("LT. Uhura- \"Captain, an urgent message.");
+           prout("  I'll put it on audio.\"  CLICK");
+           skip(1);
+           prout("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.");
+           prout("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!");
        }
-
-       if (shutup==0) {
-               // Put in THING if needed
-               if (thingx == quadx && thingy == quady) {
-                       dropin(IHQUEST, &ix, &iy);
-                        iran8(&thingx, &thingy);
-                        nenhere++;
-                        iqhere=1;
-                        game.kx[nenhere] = ix;
-                        game.ky[nenhere] = iy;
-                        game.kdist[nenhere] = game.kavgd[nenhere] =
-                           sqrt(square(sectx-ix) + square(secty-iy));
-                        game.kpower[nenhere] = Rand()*6000.0 +500.0 +250.0*skill;
-                       if (game.damage[DSRSENS] == 0.0) {
-                               skip(1);
-                               prout("MR. SPOCK- \"Captain, this is most unusual.");
-                               prout("    Please examine your short-range scan.\"");
-                       }
-               }
+    }
+
+    if (shutup==0) {
+       // Put in THING if needed
+       if (thingx == quadx && thingy == quady) {
+           dropin(IHQUEST, &ix, &iy);
+           iran(GALSIZE, &thingx, &thingy);
+           nenhere++;
+           iqhere=1;
+           game.kx[nenhere] = ix;
+           game.ky[nenhere] = iy;
+           game.kdist[nenhere] = game.kavgd[nenhere] =
+               sqrt(square(sectx-ix) + square(secty-iy));
+           game.kpower[nenhere] = Rand()*6000.0 +500.0 +250.0*skill;
+           if (game.damage[DSRSENS] == 0.0) {
+               skip(1);
+               prout("MR. SPOCK- \"Captain, this is most unusual.");
+               prout("    Please examine your short-range scan.\"");
+           }
        }
+    }
 
-        // Decide if quadrant needs a Tholian
-        if ((skill < 3 && Rand() <= 0.02) ||   /* Lighten up if skill is low */
-                (skill == 3 && Rand() <= 0.05) ||
-                (skill > 3 && Rand() <= 0.08)
+    // Decide if quadrant needs a Tholian
+    if ((skill < SKILL_GOOD && Rand() <= 0.02) ||   /* Lighten up if skill is low */
+       (skill == SKILL_GOOD && Rand() <= 0.05) ||
+       (skill > SKILL_GOOD && Rand() <= 0.08)
 #ifdef DEBUG
-                || strcmp(passwd, "tholianx")==0
+       || strcmp(passwd, "tholianx")==0
 #endif
-                ) {
-                do {
-                        ithx = Rand() > 0.5 ? QUADSIZE : 1;
-                        ithy = Rand() > 0.5 ? QUADSIZE : 1;
-                } while (game.quad[ithx][ithy] != IHDOT);
-                game.quad[ithx][ithy] = IHT;
-                ithere = 1;
-                nenhere++;
-                game.kx[nenhere] = ithx;
-                game.ky[nenhere] = ithy;
-                game.kdist[nenhere] = game.kavgd[nenhere] =
-                   sqrt(square(sectx-ithx) + square(secty-ithy));
-                game.kpower[nenhere] = Rand()*400.0 +100.0 +25.0*skill;
-                /* Reserve unocupied corners */
-                if (game.quad[1][1]==IHDOT) game.quad[1][1] = 'X';
-                if (game.quad[1][QUADSIZE]==IHDOT) game.quad[1][QUADSIZE] = 'X';
-                if (game.quad[QUADSIZE][1]==IHDOT) game.quad[QUADSIZE][1] = 'X';
-                if (game.quad[QUADSIZE][QUADSIZE]==IHDOT) game.quad[QUADSIZE][QUADSIZE] = 'X';
-        }
-        sortkl();
-
-       // Put in a few black holes
-       for (i = 1; i <= 3; i++)
-               if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);
-
-       // Take out X's in corners if Tholian present
-       if (ithere) {
-               if (game.quad[1][1]=='X') game.quad[1][1] = IHDOT;
-               if (game.quad[1][QUADSIZE]=='X') game.quad[1][QUADSIZE] = IHDOT;
-               if (game.quad[QUADSIZE][1]=='X') game.quad[QUADSIZE][1] = IHDOT;
-               if (game.quad[QUADSIZE][QUADSIZE]=='X') game.quad[QUADSIZE][QUADSIZE] = IHDOT;
-       }               
+       ) {
+       do {
+           ithx = Rand() > 0.5 ? QUADSIZE : 1;
+           ithy = Rand() > 0.5 ? QUADSIZE : 1;
+       } while (game.quad[ithx][ithy] != IHDOT);
+       game.quad[ithx][ithy] = IHT;
+       ithere = 1;
+       nenhere++;
+       game.kx[nenhere] = ithx;
+       game.ky[nenhere] = ithy;
+       game.kdist[nenhere] = game.kavgd[nenhere] =
+           sqrt(square(sectx-ithx) + square(secty-ithy));
+       game.kpower[nenhere] = Rand()*400.0 +100.0 +25.0*skill;
+       /* Reserve unocupied corners */
+       if (game.quad[1][1]==IHDOT) game.quad[1][1] = 'X';
+       if (game.quad[1][QUADSIZE]==IHDOT) game.quad[1][QUADSIZE] = 'X';
+       if (game.quad[QUADSIZE][1]==IHDOT) game.quad[QUADSIZE][1] = 'X';
+       if (game.quad[QUADSIZE][QUADSIZE]==IHDOT) game.quad[QUADSIZE][QUADSIZE] = 'X';
+    }
+    sortkl();
+
+    // Put in a few black holes
+    for (i = 1; i <= 3; i++)
+       if (Rand() > 0.5) dropin(IHBLANK, &ix, &iy);
+
+    // Take out X's in corners if Tholian present
+    if (ithere) {
+       if (game.quad[1][1]=='X') game.quad[1][1] = IHDOT;
+       if (game.quad[1][QUADSIZE]=='X') game.quad[1][QUADSIZE] = IHDOT;
+       if (game.quad[QUADSIZE][1]=='X') game.quad[QUADSIZE][1] = IHDOT;
+       if (game.quad[QUADSIZE][QUADSIZE]=='X') game.quad[QUADSIZE][QUADSIZE] = IHDOT;
+    }          
 }
 
-void sortkl(void) {
-       double t;
-       int sw, j, k;
-
-       // The author liked bubble sort. So we will use it. :-(
-
-        if (nenhere-iqhere-ithere < 2) return;
-
-       do {
-               sw = FALSE;
-               for (j = 1; j < nenhere; j++)
-                       if (game.kdist[j] > game.kdist[j+1]) {
-                               sw = TRUE;
-                               t = game.kdist[j];
-                               game.kdist[j] = game.kdist[j+1];
-                               game.kdist[j+1] = t;
-                               t = game.kavgd[j];
-                               game.kavgd[j] = game.kavgd[j+1];
-                               game.kavgd[j+1] = t;
-                               k = game.kx[j];
-                               game.kx[j] = game.kx[j+1];
-                               game.kx[j+1] = k;
-                               k = game.ky[j];
-                               game.ky[j] = game.ky[j+1];
-                               game.ky[j+1] = k;
-                               t = game.kpower[j];
-                               game.kpower[j] = game.kpower[j+1];
-                               game.kpower[j+1] = t;
-                       }
-       } while (sw);
+void sortkl(void) 
+{
+    double t;
+    int sw, j, k;
+
+    // The author liked bubble sort. So we will use it. :-(
+
+    if (nenhere-iqhere-ithere < 2) return;
+
+    do {
+       sw = FALSE;
+       for (j = 1; j < nenhere; j++)
+           if (game.kdist[j] > game.kdist[j+1]) {
+               sw = TRUE;
+               t = game.kdist[j];
+               game.kdist[j] = game.kdist[j+1];
+               game.kdist[j+1] = t;
+               t = game.kavgd[j];
+               game.kavgd[j] = game.kavgd[j+1];
+               game.kavgd[j+1] = t;
+               k = game.kx[j];
+               game.kx[j] = game.kx[j+1];
+               game.kx[j+1] = k;
+               k = game.ky[j];
+               game.ky[j] = game.ky[j+1];
+               game.ky[j+1] = k;
+               t = game.kpower[j];
+               game.kpower[j] = game.kpower[j+1];
+               game.kpower[j+1] = t;
+           }
+    } while (sw);
 }
diff --git a/sst.c b/sst.c
index 8ba3b4ff6448fe7f256777c14c222f477888f9ca..23e10016f42312fd7c8994f33b0ecffe3b5f9f58 100644 (file)
--- a/sst.c
+++ b/sst.c
@@ -87,11 +87,14 @@ Here are Stas Sergeev's changes:
 
 Eric Raymond's changes:
 
+ Mainly, I translated this C code out of FORTRAN into C -- created #defines
+   for a lot of magic numbers.
+
    1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
 
    2. Status report now indicates when dilithium crystals are on board.
 
-   3. Can now report vbases left in scrscan.
+   3. Can now report starbases left in scrscan.
 
    */
 
@@ -420,7 +423,7 @@ static void makemoves(void) {
                        case SAVE:                      // Save Game
                                freeze(FALSE);
                                 clrscr();
-                               if (skill > 3)
+                               if (skill > SKILL_GOOD)
                                         prout("WARNING--Saved games produce no plaques!");
                                break;
                        case DEATHRAY:          // Try a desparation measure
@@ -588,14 +591,9 @@ double Rand(void) {
        return rand()/(1.0 + (double)RAND_MAX);
 }
 
-void iran8(int *i, int *j) {
-       *i = Rand()*8.0 + 1.0;
-       *j = Rand()*8.0 + 1.0;
-}
-
-void iran10(int *i, int *j) {
-       *i = Rand()*10.0 + 1.0;
-       *j = Rand()*10.0 + 1.0;
+void iran(int size, int *i, int *j) {
+    *i = Rand()*(size*1.0) + 1.0;
+    *j = Rand()*(size*1.0) + 1.0;
 }
 
 void chew(void) {
diff --git a/sst.h b/sst.h
index e67073b46fe0565764cdcfadd8c6ef3e5a3f2dea..5b68074186a972e7fc4c0b43c7141fa4406440f0 100644 (file)
--- a/sst.h
+++ b/sst.h
@@ -59,20 +59,32 @@ typedef struct {
 } snapshot;                            // Data that is snapshot
 
 /*
- * This is how the integers in galaxy are encoded.
+ * This is how the integers in the galaxy array are encoded.
  * Someday these should turn into structure fields.
  */
 #define SUPERNOVA_PLACE        1000
-#define ENEMY_PLACE    100
+#define KLINGON_PLACE  100
 #define BASE_PLACE     10
 #define STAR_PLACE     1
+#define KLINGONS(n)    ((n)/KLINGON_PLACE)
+#define BASES(n)       (((n)%KLINGON_PLACE)/BASE_PLACE)
+#define STARS(n)       ((n)%BASE_PLACE)
+#define NOEXIT(s)      ((s) > 899)     /* supernova or >8 Klingons */
 
 /* for newstuff */
 #define ROMULAN_PLACE  10
+#define ROMULANS(n)    ((n)/ROMULAN_PLACE)
 
 /* for starch */
 #define CHART_UNKNOWN  -1
 
+#define SKILL_NONE     0
+#define SKILL_NOVICE   1
+#define SKILL_FAIR     2
+#define SKILL_GOOD     3
+#define SKILL_EXPERT   4
+#define SKILL_EMERITUS 5
+
 // Scalar variables that are needed for freezing the game
 // are placed in a structure. #defines are used to access by their
 // original names. Gee, I could have done this with the d structure,
@@ -417,8 +429,7 @@ void crmshp(void);
 char *cramlc(enum loctype, int, int);
 double expran(double);
 double Rand(void);
-void iran8(int *, int *);
-void iran10(int *, int *);
+void iran(int, int *, int *);
 #define square(i) ((i)*(i))
 void dropin(int, int*, int*);
 void newcnd(void);