Enable environment variable TMPDIR to set the log temporary directory.
[super-star-trek.git] / src / sst.c
index ed1fa124d16c4ca8ab83ebd30bac292ff938a865..64dcd3d0c1b093a7f593173c558d0adf723d8f34 100644 (file)
--- a/src/sst.c
+++ b/src/sst.c
@@ -189,7 +189,7 @@ int seed;           // the random-number seed
 bool idebug;           // debug mode
 FILE *logfp, *replayfp;
 
-char *systnames[NINHAB + 1];
+char *systnames[NINHAB];
 char *device[NDEVICES];
 
 static struct 
@@ -276,13 +276,13 @@ commands[] = {
        {"HELP",        HELP,           0},
 #define SEED   37
        {"SEED",        SEED,           0},
-#if BSD_BUG_FOR_BUG
+#ifdef BSD_BUG_FOR_BUG
 #define VISUAL 38
        {"VISUAL",      VISUAL,         0},
 #endif
 };
 
-#define NUMCOMMANDS    sizeof(commands)/sizeof(commands[0])
+#define NUMCOMMANDS    ARRAY_SIZE(commands)
 #define ACCEPT(i)      (!commands[i].option || (commands[i].option & game.options))
 
 static void listCommands(void) 
@@ -318,14 +318,16 @@ static void helpme(void)
            key = scan();
        }
        setwnd(message_window);
-       if (key == IHEOL) return;
+       if (key == IHEOL)
+           return;
        for (i = 0; i < NUMCOMMANDS; i++) {
            if (ACCEPT(i) && strcasecmp(commands[i].name, citem)==0) {
                i = commands[i].value;
                break;
            }
        }
-       if (i != NUMCOMMANDS) break;
+       if (i != NUMCOMMANDS)
+           break;
        skip(1);
        listCommands();
        key = IHEOL;
@@ -387,13 +389,6 @@ static void helpme(void)
     fclose(fp);
 }
 
-void enqueue(char *s)
-/* enqueue input for the command parser */
-{
-    chew();
-    strcpy(line, s);
-}
-
 static void makemoves(void)
 /* command-interpretation loop */
 {
@@ -413,7 +408,8 @@ static void makemoves(void)
            clrscr();
            proutn("COMMAND> ");
            if (scan() == IHEOL) {
-               makechart();
+               if (game.options & OPTION_CURSES)
+                   makechart();
                continue;
            }
            game.ididit = false;
@@ -439,24 +435,26 @@ static void makemoves(void)
        commandhook(commands[i].name, true);
        switch (v) { /* command switch */
        case SRSCAN:                 // srscan
-           srscan(SCAN_FULL);
+           srscan();
            break;
        case STATUS:                 // status
-           srscan(SCAN_STATUS);
+           status(0);
            break;
        case REQUEST:                   // status request 
-           srscan(SCAN_REQUEST);
+           request();
            break;
        case LRSCAN:                    // lrscan
            lrscan();
            break;
        case PHASERS:                   // phasers
            phasers();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case TORPEDO:                   // photons
            photon();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case MOVE:                      // move
            warp(false);
@@ -470,23 +468,25 @@ static void makemoves(void)
            break;
        case DOCK:                      // dock
            dock(true);
-           if (game.ididit) attack(false);
+           if (game.ididit)
+               attack(false);          
            break;
        case DAMAGES:                   // damages
-           dreprt();
+           damagereport();
            break;
        case CHART:                     // chart
-           chart(false);
+           makechart();
            break;
        case IMPULSE:                   // impulse
-           impuls();
+           impulse();
            break;
        case REST:                      // rest
            wait();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case WARP:                      // warp
-           setwrp();
+           setwarp();
            break;
        case SCORE:                     // score
            score();
@@ -496,25 +496,29 @@ static void makemoves(void)
            break;
        case ORBIT:                     // orbit
            orbit();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case TRANSPORT:                 // transport "beam"
            beam();
            break;
        case MINE:                      // mine
            mine();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case CRYSTALS:                  // crystals
            usecrystals();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case SHUTTLE:                   // shuttle
            shuttle();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case PLANETS:                   // Planet list
-           preport();
+           survey();
            break;
        case REPORT:                    // Game Report 
            report();
@@ -532,10 +536,11 @@ static void makemoves(void)
            break;
        case PROBE:
            probe();                    // Launch probe
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case ABANDON:                   // Abandon Ship
-           abandn();
+           abandon();
            break;
        case DESTRUCT:                  // Self Destruct
            selfdestruct();
@@ -548,14 +553,16 @@ static void makemoves(void)
            break;
        case DEATHRAY:                  // Try a desparation measure
            deathray();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case DEBUGCMD:                  // What do we want for debug???
            debugme();
            break;
        case MAYDAY:                    // Call for help
            mayday();
-           if (game.ididit) hitme = true;
+           if (game.ididit)
+               hitme = true;
            break;
        case QUIT:
            game.alldone = true;                // quit the game
@@ -568,7 +575,7 @@ static void makemoves(void)
            if (key == IHREAL)
                seed = (int)aaitem;
            break;
-#if BSD_BUG_FOR_BUG
+#ifdef BSD_BUG_FOR_BUG
        case VISUAL:
            visual();                   // perform visual scan
            break;
@@ -576,10 +583,12 @@ static void makemoves(void)
        }
        commandhook(commands[i].name, false);
        for (;;) {
-           if (game.alldone) break;            // Game has ended
+           if (game.alldone)
+               break;          // Game has ended
            if (game.optime != 0.0) {
                events();
-               if (game.alldone) break;        // Events did us in
+               if (game.alldone)
+                   break;      // Events did us in
            }
            if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) { // Galaxy went Nova!
                atover(false);
@@ -587,7 +596,8 @@ static void makemoves(void)
            }
            if (hitme && !game.justin) {
                attack(true);
-               if (game.alldone) break;
+               if (game.alldone)
+                   break;
                if (game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova) {    // went NOVA! 
                    atover(false);
                    hitme = true;
@@ -596,9 +606,11 @@ static void makemoves(void)
            }
            break;
        }
-       if (game.alldone) break;
+       if (game.alldone)
+           break;
     }
-    if (idebug) prout("=== Ending");
+    if (idebug)
+       prout("=== Ending");
 }
 
 
@@ -619,11 +631,11 @@ int main(int argc, char **argv)
            replayfp = fopen(optarg, "r");
            if (replayfp == NULL) {
                fprintf(stderr, "sst: can't open replay file %s\n", optarg);
-               exit(1);        
+               exit(1);
            }
            if (fscanf(replayfp, "seed %d\n", &seed) != 1) {
                fprintf(stderr, "sst: replay file %s is ill-formed\n", optarg);
-               exit(1);        
+               exit(1);
            }
            /* FALL THROUGH */
        case 't':
@@ -639,12 +651,13 @@ int main(int argc, char **argv)
        }
     }
     /* where to save the input in case of bugs */
-    logfp = fopen("sst-input.log", "w");
-    setlinebuf(logfp);
-    fprintf(logfp, "seed %d\n", seed);
+    logfp = fopen("/usr/tmp/sst-input.log", "w");
+    if (logfp) {
+       setlinebuf(logfp);
+       fprintf(logfp, "seed %d\n", seed);
+    }
     srand(seed);
 
-    srand(seed);
     iostart();
 
     line[0] = '\0';
@@ -661,7 +674,8 @@ int main(int argc, char **argv)
            score();
            game.alldone = false;
        }
-       else makemoves();
+       else
+           makemoves();
        skip(1);
        stars();
        skip(1);
@@ -674,7 +688,8 @@ int main(int argc, char **argv)
            }
        }
        proutn(_("Do you want to play again? "));
-       if (!ja()) break;
+       if (!ja())
+           break;
     }
     skip(1);
     prout(_("May the Great Bird of the Galaxy roost upon your home planet."));
@@ -711,8 +726,10 @@ char *cramlc(enum loctype key, coord w)
 {
     static char buf[32];
     buf[0] = '\0';
-    if (key == quadrant) strcpy(buf, _("Quadrant "));
-    else if (key == sector) strcpy(buf, _("Sector "));
+    if (key == quadrant)
+       strcpy(buf, _("Quadrant "));
+    else if (key == sector)
+       strcpy(buf, _("Sector "));
     sprintf(buf+strlen(buf), "%d - %d", w.x, w.y);
     return buf;
 }
@@ -720,7 +737,8 @@ char *cramlc(enum loctype key, coord w)
 void crmena(bool stars, feature enemy, enum loctype key, coord w) 
 /* print an enemy and his location */
 {
-    if (stars) proutn("***");
+    if (stars)
+       proutn("***");
     cramen(enemy);
     proutn(_(" at "));
     proutn(cramlc(key, w));
@@ -808,24 +826,18 @@ int scan(void)
        chew();
        return IHEOL;
     }
-    if (isdigit(*linep) || *linep=='+' || *linep=='-' || *linep=='.') {
-       // treat as a number
-       i = 0;
-       if (sscanf(linep, "%lf%n", &aaitem, &i) < 1) {
-           linep = line; // Invalid numbers are ignored
-           *linep = 0;
-           return IHEOL;
-       }
-       else {
-           // skip to end
-           linep += i;
-           return IHREAL;
-       }
+    i = 0;
+    // try a number
+    if (sscanf(linep, "%lf%n", &aaitem, &i) > 0) {
+       // skip to end
+       linep += i;
+       return IHREAL;
     }
     // Treat as alpha
     cp = citem;
     while (*linep && *linep!=' ') {
-       if ((cp - citem) < 9) *cp++ = tolower(*linep);
+       if ((cp - citem) < 9)
+           *cp++ = tolower(*linep);
        linep++;
     }
     *cp = 0;
@@ -839,8 +851,10 @@ bool ja(void)
     for(;;) {
        scan();
        chew();
-       if (*citem == 'y') return true;
-       if (*citem == 'n') return false;
+       if (*citem == 'y')
+           return true;
+       if (*citem == 'n')
+           return false;
        proutn(_("Please answer with \"y\" or \"n\": "));
     }
 }
@@ -864,7 +878,8 @@ void debugme(void)
 {
     proutn("Reset levels? ");
     if (ja() == true) {
-       if (game.energy < game.inenrg) game.energy = game.inenrg;
+       if (game.energy < game.inenrg)
+           game.energy = game.inenrg;
        game.shield = game.inshld;
        game.torps = game.intorps;
        game.lsupres = game.inlsr;
@@ -879,8 +894,10 @@ void debugme(void)
     proutn("Toggle debug flag? ");
     if (ja() == true) {
        idebug = !idebug;
-       if (idebug) prout("Debug output ON");
-       else prout("Debug output OFF");
+       if (idebug)
+           prout("Debug output ON");       
+       else
+           prout("Debug output OFF");
     }
     proutn("Cause selective damage? ");
     if (ja() == true) {