More factoring out.
[super-star-trek.git] / sst.c
diff --git a/sst.c b/sst.c
index c8824af5c8d48fc514cb7e5f129635d2bd2490e4..2e1038b0469d7b2a7a9a7f649d22e157daff8ab1 100644 (file)
--- a/sst.c
+++ b/sst.c
@@ -1,11 +1,9 @@
 #define INCLUDED       // Define externs here
 #include <ctype.h>
 #include <getopt.h>
-#ifdef SERGEEV
-#include <conio.h>
 #include <time.h>
+#include "conio.h"
 #include "sstlinux.h"
-#endif /* SERGEEV */
 #include "sst.h"
 
 #ifndef SSTDOC
@@ -86,88 +84,109 @@ SERGEEV, not yet completely merged):
     10. Ramming a black hole is no longer instant death.  There is a
         chance you might get timewarped instead.
 
+    11. "freeze" command reverts to "save", most people will understand this
+        better anyway.
+
+Eric Raymond's changes:
+
+     1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+
    */
 
-static char *commands[] = {
-#ifdef SERGEEV
-        "--",
-        "---",
-#else
-       "srscan",
-       "lrscan",
-#endif /* SERGEEV */
-       "phasers",
-#ifdef SERGEEV
-        "torpedo",
-#else
-       "photons",
-#endif /* SERGEEV */
-       "move",
-       "shields",
-       "dock",
-       "damages",
-       "chart",
-       "impulse",
-       "rest",
-       "warp",
-#ifdef SERGEEV
-        "score",
-        "----",
-#else
-       "status",
-       "sensors",
-#endif /* SERGEEV */
-       "orbit",
-       "transport",
-       "mine",
-       "crystals",
-       "shuttle",
-       "planets",
-#ifdef SERGEEV
-        "-----",
-#else
-       "request",
-#endif /* SERGEEV */
-       "report",
-       "computer",
-       "commands",
-       "emexit",
-       "probe",
-       "abandon",
-       "destruct",
-#ifdef SERGEEV
-        "save",
-#else
-       "freeze",
+static struct 
+{
+    char *name;
+    int value;
+}
+commands[] = {
+#ifndef SERGEEV
+#define SRSCAN 1
+       {"SRSCAN",      SRSCAN},
+       {"STATUS",      SRSCAN},
+#define LRSCAN 2
+       {"LRSCAN",      LRSCAN},
 #endif /* SERGEEV */
-       "deathray",
-       "debug",
-#ifdef SERGEEV
-        "sos",
-#else
-       "call",
+#define PHASERS        3
+       {"PHASERS",     PHASERS},
+#define TORPEDO        4
+        {"TORPEDO",    TORPEDO},
+       {"PHOTONS",     TORPEDO},
+#define MOVE   5
+       {"MOVE",        MOVE},
+#define SHIELDS        6
+       {"SHIELDS",     SHIELDS},
+#define DOCK   7
+       {"DOCK",        DOCK},
+#define DAMAGES        8
+       {"DAMAGES",     DAMAGES},
+#define CHART  9
+       {"CHART",       CHART},
+#define IMPULSE        10
+       {"IMPULSE",     IMPULSE},
+#define REST   11
+       {"REST",        REST},
+#define WARP   12
+       {"WARP",        WARP},
+#define SCORE  13
+       {"SCORE",       SCORE},
+#ifndef SERGEEV
+#define SENSORS        14
+       {"SENSORS",     SENSORS},
 #endif /* SERGEEV */
-       "quit",
-       "help"
+#define ORBIT  15
+       {"ORBIT",       ORBIT},
+#define TRANSPORT      16
+       {"TRANSPORT",   TRANSPORT},
+#define MINE   17
+       {"MINE",        MINE},
+#define CRYSTALS 18
+       {"CRYSTALS",    CRYSTALS},
+#define SHUTTLE        19
+       {"SHUTTLE",     SHUTTLE},
+#define PLANETS        20
+       {"PLANETS",     PLANETS},
+#define REPORT 21
+       {"REPORT",      REPORT},
+#define COMPUTER       23
+       {"COMPUTER",    COMPUTER},
+#define COMMANDS       24
+       {"COMMANDS",    COMMANDS},
+#define EMEXIT 25
+       {"EMEXIT",      EMEXIT},
+#define PROBE  26
+       {"PROBE",       PROBE},
+#define SAVE   27
+       {"SAVE",        SAVE},
+       {"FREEZE",      SAVE},
+#define ABANDON        28
+       {"ABANDON",     ABANDON},
+#define DESTRUCT 29
+       {"DESTRUCT",    DESTRUCT},
+#define DEATHRAY 30
+       {"DEATHRAY",    DEATHRAY},
+#define DEBUGCMD       31
+       {"DEBUG",       DEBUGCMD},
+#define MAYDAY 32
+       {"MAYDAY",      MAYDAY},
+       {"SOS",         MAYDAY},
+       {"CALL",        MAYDAY},
+#define QUIT   33
+       {"QUIT",        QUIT},
+#define HELP   34
+       {"HELP",        HELP},
 };
 
-#ifdef SERGEEV
-wnd wnds[6]={{1,1,80,25},{1,1,25,12},{26,2,80,12},{65,1,80,10},{1,13,80,23},{1,24,80,25}};
-short curwnd;
-#endif /* SERGEEV */
-
 #define NUMCOMMANDS    sizeof(commands)/sizeof(commands[0])
 
 static void listCommands(int x) {
-        proutn   ("LEGAL COMMANDS ARE:\n\r"
-                  "   MOVE      PHASERS   SOS       PROBE\n\r"
-                  "   COMPUTER  IMPULSE   TORPEDO   ABANDON\n\r"
-                  "   EMEXIT    WARP      SHIELDS   DESTRUCT\n\r"
-                  "   CHART     REST      DOCK      QUIT\n\r"
-                  "   DAMAGES   REPORT    SCORE     ORBIT\n\r"
-                  "   TRANSPORT MINE      CRYSTALS  SHUTTLE\n\r"
-                  "   PLANETS   DEATHRAY  SAVE      COMMANDS\n\r");
-       if (x) prout("   HELP");
+    int i;
+    prout("LEGAL COMMANDS ARE:");
+    for (i = 0; i < NUMCOMMANDS; i++) {
+       proutn("%-12s ", commands[i].name);
+       if (i % 5 == 4)
+           skip(1);
+    }
+    skip(1);
 }
 
 static void helpme(void) {
@@ -180,18 +199,17 @@ static void helpme(void) {
        key = scan();
        while (TRUE) {
                if (key == IHEOL) {
-#ifdef SERGEEV
-                        setwnd(5);
-#endif /* SERGEEV */
+                        setwnd(BOTTOM_WINDOW);
                         proutn("Help on what command? ");
                        key = scan();
                }
-#ifdef SERGEEV
-                setwnd(4);
-#endif /* SERGEEV */
+                setwnd(LOWER_WINDOW);
                if (key == IHEOL) return;
                for (i = 0; i < NUMCOMMANDS; i++) {
-                       if (strcmp(commands[i], citem)==0) break;
+                   if (strcasecmp(commands[i].name, citem)==0) {
+                       i = commands[i].value;
+                       break;
+                   }
                }
                if (i != NUMCOMMANDS) break;
                skip(1);
@@ -201,12 +219,12 @@ static void helpme(void) {
                chew();
                skip(1);
        }
-       if (i == 23) {
+       if (i == COMMANDS) {
                strcpy(cmdbuf, " ABBREV");
        }
        else {
-           for (j = 0; commands[i][j]; j++)
-               cmdbuf[j] = toupper(commands[i][j]);
+           for (j = 0; commands[i].name[j]; j++)
+               cmdbuf[j] = toupper(commands[i].name[j]);
            cmdbuf[j] = '\0';
        }
        fp = fopen(SSTDOC, "r");
@@ -229,7 +247,7 @@ static void helpme(void) {
                for (cp = linebuf+3; isspace(*cp); cp++)
                        continue;
                linebuf[strlen(linebuf)-1] = '\0';
-               if (strcmp(cp, cmdbuf) == 0)
+               if (strcasecmp(cp, cmdbuf) == 0)
                    break;
            }
        }
@@ -246,34 +264,10 @@ static void helpme(void) {
        fclose(fp);
 }
 
-void drawmaps(short l) {
-/* hook to be called after moving to redraw maps */
-#ifdef SERGEEV
-     _setcursortype(_NOCURSOR);
-     if (l==1) sensor();
-     if (l!=2) setwnd(1);
-     gotoxy(1,1);
-     strcpy(line,"s");
-     srscan(1);
-     if (l!=2){
-        setwnd(2);
-        clrscr();
-        srscan(2);
-        setwnd(3);
-        clrscr();
-        strcpy(line,"l");
-        lrscan();
-        _setcursortype(_NORMALCURSOR);
-     }
-#endif /* SERGEEV */
-}
-
 static void makemoves(void) {
        int i, hitme;
-#ifdef SERGEEV
         clrscr();
-        setwnd(4);
-#endif /* SERGEEV */
+        setwnd(LOWER_WINDOW);
        while (TRUE) { /* command loop */
                 drawmaps(1);
                 while (TRUE)  { /* get a command */
@@ -282,176 +276,170 @@ static void makemoves(void) {
                        Time = 0.0;
                        i = -1;
                        chew();
-#ifdef SERGEEV
-                        setwnd(5);
+                        setwnd(BOTTOM_WINDOW);
                         clrscr();
-#endif /* SERGEEV */
                        proutn("COMMAND> ");
                         if (scan() == IHEOL) {
 #ifdef SERGEEV
                             _setcursortype(_NOCURSOR);
-                            setwnd(4);
+                            setwnd(LOWER_WINDOW);
                             clrscr();
                             chart(0);
                             _setcursortype(_NORMALCURSOR);
 #endif /* SERGEEV */
                             continue;
                         }
-#ifdef SERGEEV
                         ididit=0;
                         clrscr();
-                        setwnd(4);
+                        setwnd(LOWER_WINDOW);
                         clrscr();
-#endif /* SERGEEV */
-                       for (i=0; i < 26; i++)
-                               if (isit(commands[i]))
-                                       break;
-                       if (i < 26) break;
+                       for (i=0; i < ABANDON; i++)
+                           if (isit(commands[i].name)) {
+                               i = commands[i].value;
+                               break;
+                           }
+                       if (i < ABANDON) break;
                        for (; i < NUMCOMMANDS; i++)
-                               if (strcmp(commands[i], citem) == 0) break;
+                           if (strcasecmp(commands[i].name, citem) == 0) {
+                                   i = commands[i].value;
+                                   break;
+                           }
                        if (i < NUMCOMMANDS) break;
 
                        listCommands(TRUE);
                }
-               commandhook(commands[i], TRUE);
+               commandhook(commands[i].name, TRUE);
                switch (i) { /* command switch */
 #ifndef SERGEEV
-                        case 0:                 // srscan
+                        case SRSCAN:                 // srscan
                                srscan(1);
                                break;
-                       case 1:                 // lrscan
+                       case LRSCAN:                    // lrscan
                                lrscan();
                                 break;
 #endif /* SERGEEV */
-                       case 2:                 // phasers
+                       case PHASERS:                   // phasers
                                phasers();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 3:                 // photons
+                       case TORPEDO:                   // photons
                                photon();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 4:                 // move
+                       case MOVE:                      // move
                                warp(1);
                                break;
-                       case 5:                 // shields
+                       case SHIELDS:                   // shields
                                doshield(1);
                                if (ididit) {
                                        hitme=TRUE;
                                        shldchg = 0;
                                }
                                break;
-                       case 6:                 // dock
+                       case DOCK:                      // dock
                                 dock(1);
                                 if (ididit) attack(0);
                                break;
-                       case 7:                 // damages
+                       case DAMAGES:                   // damages
                                dreprt();
                                break;
-                       case 8:                 // chart
+                       case CHART:                     // chart
                                chart(0);
                                break;
-                       case 9:                 // impulse
+                       case IMPULSE:                   // impulse
                                impuls();
                                break;
-                       case 10:                // rest
+                       case REST:              // rest
                                wait();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 11:                // warp
+                       case WARP:              // warp
                                setwrp();
                                break;
-                        case 12:                // score
+                        case SCORE:                // score
                                 score();
                                break;
 #ifndef SERGEEV
-                       case 13:                        // sensors
+                       case SENSORS:                   // sensors
                                sensor();
                                break;
 #endif /* SERGEEV */
-                       case 14:                        // orbit
+                       case ORBIT:                     // orbit
                                orbit();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 15:                        // transport "beam"
+                       case TRANSPORT:                 // transport "beam"
                                beam();
                                break;
-                       case 16:                        // mine
+                       case MINE:                      // mine
                                mine();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 17:                        // crystals
+                       case CRYSTALS:                  // crystals
                                usecrystals();
                                 if (ididit) hitme = TRUE;
                                break;
-                       case 18:                        // shuttle
+                       case SHUTTLE:                   // shuttle
                                shuttle();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 19:                        // Planet list
+                       case PLANETS:                   // Planet list
                                preport();
                                break;
-                       case 20:                        // Status information
-                               srscan(2);
-                               break;
-                       case 21:                        // Game Report 
+                       case REPORT:                    // Game Report 
                                report();
                                break;
-                       case 22:                        // use COMPUTER!
+                       case COMPUTER:                  // use COMPUTER!
                                eta();
                                break;
-                       case 23:
+                       case COMMANDS:
                                listCommands(TRUE);
                                break;
-                       case 24:                // Emergency exit
-#ifdef SERGEEV
+                       case EMEXIT:            // Emergency exit
                                clrscr();       // Hide screen
-#endif /* SERGEEV */
                                freeze(TRUE);   // forced save
                                exit(1);                // And quick exit
                                break;
-                       case 25:
+                       case PROBE:
                                probe();                // Launch probe
                                 if (ididit) hitme = TRUE;
                                break;
-                       case 26:                        // Abandon Ship
+                       case ABANDON:                   // Abandon Ship
                                abandn();
                                break;
-                       case 27:                        // Self Destruct
+                       case DESTRUCT:                  // Self Destruct
                                dstrct();
                                break;
-                       case 28:                        // Save Game
+                       case SAVE:                      // Save Game
                                freeze(FALSE);
-#ifdef SERGEEV
                                 clrscr();
-#endif /* SERGEEV */
                                if (skill > 3)
                                         prout("WARNING--Saved games produce no plaques!");
                                break;
-                       case 29:                        // Try a desparation measure
+                       case DEATHRAY:          // Try a desparation measure
                                deathray();
                                if (ididit) hitme = TRUE;
                                break;
-                       case 30:                        // What do we want for debug???
+                       case DEBUGCMD:          // What do we want for debug???
 #ifdef DEBUG
                                debugme();
 #endif
                                break;
-                       case 31:                // Call for help
+                       case MAYDAY:            // Call for help
                                help();
                                 if (ididit) hitme = TRUE;
                                break;
-                       case 32:
+                       case QUIT:
                                alldone = 1;    // quit the game
 #ifdef DEBUG
                                if (idebug) score();
 #endif
                                break;
-                       case 33:
+                       case HELP:
                                helpme();       // get help
                                break;
                }
-               commandhook(commands[i], FALSE);
+               commandhook(commands[i].name, FALSE);
                for (;;) {
                        if (alldone) break;             // Game has ended
 #ifdef DEBUG
@@ -495,14 +483,9 @@ int main(int argc, char **argv) {
            }
        }
 
-#ifndef SERGEEV
-       iostart(usecurses);
-#else
        randomize();
-        textattr(7);
-        clrscr();
-        setwnd(0);
-#endif /* SERGEEV */
+       iostart(usecurses);
+
        line[0] = '\0';
        for (i = optind; i < argc;  i++) {
                strcat(line, argv[i]);
@@ -529,15 +512,11 @@ int main(int argc, char **argv) {
                }
                proutn("Do you want to play again? ");
                if (!ja()) break;
-#ifdef SERGEEV
-               setwnd(0);
+               setwnd(FULLSCREEN_WINDOW);
                clrscr();
-#endif /* SERGEEV */
        }
        skip(1);
-#ifndef SERGEEV
        ioend();
-#endif /* SERGEEV */
        prout("May the Great Bird of the Galaxy roost upon your home planet.");
        return 0;
 }
@@ -638,15 +617,13 @@ int scan(void) {
                        chew();
                        return IHEOL;
                }
-               getline(line, sizeof(line));
-#ifdef SERGEEV
+               cgetline(line, sizeof(line));
                 fflush(stdin);
-                if (curwnd==5){
+                if (curwnd==BOTTOM_WINDOW){
                    clrscr();
-                   setwnd(4);
+                   setwnd(LOWER_WINDOW);
                    clrscr();
                 }
-#endif /* SERGEEV */
                linep = line;
        }
        // Skip leading white space
@@ -701,7 +678,7 @@ int isit(char *s) {
        /* New function -- compares s to scaned citem and returns true if it
           matches to the length of s */
 
-       return strncmp(s, citem, max(1, strlen(citem))) == 0;
+       return strncasecmp(s, citem, max(1, strlen(citem))) == 0;
 
 }