Better command suppression.
[super-star-trek.git] / sst.c
diff --git a/sst.c b/sst.c
index 2e1038b0469d7b2a7a9a7f649d22e157daff8ab1..89e069d51696293328651b8a716f6754a14e7120 100644 (file)
--- a/sst.c
+++ b/sst.c
@@ -2,7 +2,6 @@
 #include <ctype.h>
 #include <getopt.h>
 #include <time.h>
 #include <ctype.h>
 #include <getopt.h>
 #include <time.h>
-#include "conio.h"
 #include "sstlinux.h"
 #include "sst.h"
 
 #include "sstlinux.h"
 #include "sst.h"
 
@@ -10,8 +9,6 @@
 #define SSTDOC "sst.doc"
 #endif
        
 #define SSTDOC "sst.doc"
 #endif
        
-static char line[128], *linep = line;
-
 /*
 
 Here are Tom Almy's changes:
 /*
 
 Here are Tom Almy's changes:
@@ -49,103 +46,109 @@ Here are Tom Almy's changes:
 
    6. Perhaps cloaking to be added later? BSD version
 
 
    6. Perhaps cloaking to be added later? BSD version
 
-Here are Stas Sergeev's changes (controlled by the proprocessor symbol
-SERGEEV, not yet completely merged):
+Here are Stas Sergeev's changes:
 
    1. The Space Thingy can be shoved, if you it ram, and can fire back if 
       fired upon.
 
 
    1. The Space Thingy can be shoved, if you it ram, and can fire back if 
       fired upon.
 
-   1 The Tholian can be hit with phasers
+   2. The Tholian can be hit with phasers
 
 
-   2. When you are docked, base covers you with an almost invincible shields 
+   3. When you are docked, base covers you with an almost invincible shields 
       (a commander can still ram you, or a Romulan can destroy the base,
       or a SCom can even succeed with direct attack IIRC, but this rarely 
       happens).
 
       (a commander can still ram you, or a Romulan can destroy the base,
       or a SCom can even succeed with direct attack IIRC, but this rarely 
       happens).
 
-    3. SCom can't escape from you if no more enemies remain (without this, 
-       chasing SCom can take an eternity).
+   4. SCom can't escape from you if no more enemies remain (without this, 
+      chasing SCom can take an eternity).
 
 
-    4. Probe target you enter is now the destination quadrant. Before I don't 
-       remember what it was, but it was something I had difficulty using)
+   5. Probe target you enter is now the destination quadrant. Before I don't 
+      remember what it was, but it was something I had difficulty using)
 
 
-    5. Secret password is now autogenerated.
+   6. Secret password is now autogenerated.
 
 
-    6. "Plaque" is adjusted for A4 paper:)
+   7. "Plaque" is adjusted for A4 paper :-)
 
 
-    7. Phasers now tells you how much energy needed, but only if the computer 
+   8. Phasers now tells you how much energy needed, but only if the computer 
        is alive.
 
        is alive.
 
-    8. Planets are auto-scanned when you enter the quadrant.
+   9. Planets are auto-scanned when you enter the quadrant.
 
 
-    9. Mining or using crystals in presense of enemy now yields an attack.
+   10. Mining or using crystals in presense of enemy now yields an attack.
        There are other minor adjustments to what yields an attack
        and what does not.
 
        There are other minor adjustments to what yields an attack
        and what does not.
 
-    10. Ramming a black hole is no longer instant death.  There is a
-        chance you might get timewarped instead.
+   11. 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
+   12. "freeze" command reverts to "save", most people will understand this
         better anyway.
 
         better anyway.
 
+   13. Screen-oriented interface, with sensor scans always up.
+
 Eric Raymond's changes:
 
 Eric Raymond's changes:
 
-     1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+   1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+
+   2. Status report now indicates when dilithium crystals are on board.
 
    */
 
 
    */
 
+/* the input queue */
+static char line[128], *linep = line;
+static usecurses = TRUE;
+
 static struct 
 {
     char *name;
     int value;
 }
 commands[] = {
 static struct 
 {
     char *name;
     int value;
 }
 commands[] = {
-#ifndef SERGEEV
-#define SRSCAN 1
+#define SRSCAN 0
        {"SRSCAN",      SRSCAN},
        {"SRSCAN",      SRSCAN},
-       {"STATUS",      SRSCAN},
-#define LRSCAN 2
+#define STATUS 1
+       {"STATUS",      STATUS},
+#define REQUEST        2
+       {"REQUEST",     REQUEST},
+#define LRSCAN 3
        {"LRSCAN",      LRSCAN},
        {"LRSCAN",      LRSCAN},
-#endif /* SERGEEV */
-#define PHASERS        3
+#define PHASERS        4
        {"PHASERS",     PHASERS},
        {"PHASERS",     PHASERS},
-#define TORPEDO        4
+#define TORPEDO        5
         {"TORPEDO",    TORPEDO},
        {"PHOTONS",     TORPEDO},
         {"TORPEDO",    TORPEDO},
        {"PHOTONS",     TORPEDO},
-#define MOVE   5
+#define MOVE   6
        {"MOVE",        MOVE},
        {"MOVE",        MOVE},
-#define SHIELDS        6
+#define SHIELDS        7
        {"SHIELDS",     SHIELDS},
        {"SHIELDS",     SHIELDS},
-#define DOCK   7
+#define DOCK   8
        {"DOCK",        DOCK},
        {"DOCK",        DOCK},
-#define DAMAGES        8
+#define DAMAGES        9
        {"DAMAGES",     DAMAGES},
        {"DAMAGES",     DAMAGES},
-#define CHART  9
+#define CHART  10
        {"CHART",       CHART},
        {"CHART",       CHART},
-#define IMPULSE        10
+#define IMPULSE        11
        {"IMPULSE",     IMPULSE},
        {"IMPULSE",     IMPULSE},
-#define REST   11
+#define REST   12
        {"REST",        REST},
        {"REST",        REST},
-#define WARP   12
+#define WARP   13
        {"WARP",        WARP},
        {"WARP",        WARP},
-#define SCORE  13
+#define SCORE  14
        {"SCORE",       SCORE},
        {"SCORE",       SCORE},
-#ifndef SERGEEV
-#define SENSORS        14
+#define SENSORS        15
        {"SENSORS",     SENSORS},
        {"SENSORS",     SENSORS},
-#endif /* SERGEEV */
-#define ORBIT  15
+#define ORBIT  16
        {"ORBIT",       ORBIT},
        {"ORBIT",       ORBIT},
-#define TRANSPORT      16
+#define TRANSPORT      17
        {"TRANSPORT",   TRANSPORT},
        {"TRANSPORT",   TRANSPORT},
-#define MINE   17
+#define MINE   18
        {"MINE",        MINE},
        {"MINE",        MINE},
-#define CRYSTALS 18
+#define CRYSTALS       19
        {"CRYSTALS",    CRYSTALS},
        {"CRYSTALS",    CRYSTALS},
-#define SHUTTLE        19
+#define SHUTTLE        20
        {"SHUTTLE",     SHUTTLE},
        {"SHUTTLE",     SHUTTLE},
-#define PLANETS        20
+#define PLANETS        21
        {"PLANETS",     PLANETS},
        {"PLANETS",     PLANETS},
-#define REPORT 21
+#define REPORT 22
        {"REPORT",      REPORT},
 #define COMPUTER       23
        {"COMPUTER",    COMPUTER},
        {"REPORT",      REPORT},
 #define COMPUTER       23
        {"COMPUTER",    COMPUTER},
@@ -160,9 +163,9 @@ commands[] = {
        {"FREEZE",      SAVE},
 #define ABANDON        28
        {"ABANDON",     ABANDON},
        {"FREEZE",      SAVE},
 #define ABANDON        28
        {"ABANDON",     ABANDON},
-#define DESTRUCT 29
+#define DESTRUCT       29
        {"DESTRUCT",    DESTRUCT},
        {"DESTRUCT",    DESTRUCT},
-#define DEATHRAY 30
+#define DEATHRAY       30
        {"DEATHRAY",    DEATHRAY},
 #define DEBUGCMD       31
        {"DEBUG",       DEBUGCMD},
        {"DEATHRAY",    DEATHRAY},
 #define DEBUGCMD       31
        {"DEBUG",       DEBUGCMD},
@@ -178,13 +181,16 @@ commands[] = {
 
 #define NUMCOMMANDS    sizeof(commands)/sizeof(commands[0])
 
 
 #define NUMCOMMANDS    sizeof(commands)/sizeof(commands[0])
 
-static void listCommands(int x) {
-    int i;
-    prout("LEGAL COMMANDS ARE:");
-    for (i = 0; i < NUMCOMMANDS; i++) {
-       proutn("%-12s ", commands[i].name);
-       if (i % 5 == 4)
+#define MIN_CURSES_COMMAND     PHASERS         /* might change someday */
+
+static void listCommands(int usecurses) {
+    int i, k = 0;
+    proutn("LEGAL COMMANDS ARE:");
+    for (i = usecurses ? MIN_CURSES_COMMAND : 0; i < NUMCOMMANDS; i++) {
+       if (k % 5 == 0)
            skip(1);
            skip(1);
+       proutn("%-12s ", commands[i].name); 
+       k++;
     }
     skip(1);
 }
     }
     skip(1);
 }
@@ -199,11 +205,11 @@ static void helpme(void) {
        key = scan();
        while (TRUE) {
                if (key == IHEOL) {
        key = scan();
        while (TRUE) {
                if (key == IHEOL) {
-                        setwnd(BOTTOM_WINDOW);
+                        setwnd(prompt_window);
                         proutn("Help on what command? ");
                        key = scan();
                }
                         proutn("Help on what command? ");
                        key = scan();
                }
-                setwnd(LOWER_WINDOW);
+                setwnd(message_window);
                if (key == IHEOL) return;
                for (i = 0; i < NUMCOMMANDS; i++) {
                    if (strcasecmp(commands[i].name, citem)==0) {
                if (key == IHEOL) return;
                for (i = 0; i < NUMCOMMANDS; i++) {
                    if (strcasecmp(commands[i].name, citem)==0) {
@@ -214,7 +220,7 @@ static void helpme(void) {
                if (i != NUMCOMMANDS) break;
                skip(1);
                prout("Valid commands:");
                if (i != NUMCOMMANDS) break;
                skip(1);
                prout("Valid commands:");
-               listCommands(FALSE);
+               listCommands(usecurses);
                key = IHEOL;
                chew();
                skip(1);
                key = IHEOL;
                chew();
                skip(1);
@@ -259,15 +265,19 @@ static void helpme(void) {
        while (fgets(linebuf, sizeof(linebuf),fp)) {
                if (strstr(linebuf, "******"))
                        break;
        while (fgets(linebuf, sizeof(linebuf),fp)) {
                if (strstr(linebuf, "******"))
                        break;
-               proutc(linebuf);
+               proutn(linebuf);
        }
        fclose(fp);
 }
 
        }
        fclose(fp);
 }
 
+void enqueue(char *s) {
+    strcpy(line, s);
+}
+
 static void makemoves(void) {
        int i, hitme;
         clrscr();
 static void makemoves(void) {
        int i, hitme;
         clrscr();
-        setwnd(LOWER_WINDOW);
+        setwnd(message_window);
        while (TRUE) { /* command loop */
                 drawmaps(1);
                 while (TRUE)  { /* get a command */
        while (TRUE) { /* command loop */
                 drawmaps(1);
                 while (TRUE)  { /* get a command */
@@ -276,22 +286,16 @@ static void makemoves(void) {
                        Time = 0.0;
                        i = -1;
                        chew();
                        Time = 0.0;
                        i = -1;
                        chew();
-                        setwnd(BOTTOM_WINDOW);
+                        setwnd(prompt_window);
                         clrscr();
                        proutn("COMMAND> ");
                         if (scan() == IHEOL) {
                         clrscr();
                        proutn("COMMAND> ");
                         if (scan() == IHEOL) {
-#ifdef SERGEEV
-                            _setcursortype(_NOCURSOR);
-                            setwnd(LOWER_WINDOW);
-                            clrscr();
-                            chart(0);
-                            _setcursortype(_NORMALCURSOR);
-#endif /* SERGEEV */
+                           makechart();
                             continue;
                         }
                         ididit=0;
                         clrscr();
                             continue;
                         }
                         ididit=0;
                         clrscr();
-                        setwnd(LOWER_WINDOW);
+                        setwnd(message_window);
                         clrscr();
                        for (i=0; i < ABANDON; i++)
                            if (isit(commands[i].name)) {
                         clrscr();
                        for (i=0; i < ABANDON; i++)
                            if (isit(commands[i].name)) {
@@ -305,19 +309,22 @@ static void makemoves(void) {
                                    break;
                            }
                        if (i < NUMCOMMANDS) break;
                                    break;
                            }
                        if (i < NUMCOMMANDS) break;
-
-                       listCommands(TRUE);
+                       listCommands(usecurses);
                }
                commandhook(commands[i].name, TRUE);
                switch (i) { /* command switch */
                }
                commandhook(commands[i].name, TRUE);
                switch (i) { /* command switch */
-#ifndef SERGEEV
                         case SRSCAN:                 // srscan
                         case SRSCAN:                 // srscan
-                               srscan(1);
+                               srscan(SCAN_FULL);
+                               break;
+                        case STATUS:                 // status
+                               srscan(SCAN_STATUS);
                                break;
                                break;
+                       case REQUEST:                   // status request 
+                               srscan(SCAN_REQUEST);
+                               break;
                        case LRSCAN:                    // lrscan
                                lrscan();
                                 break;
                        case LRSCAN:                    // lrscan
                                lrscan();
                                 break;
-#endif /* SERGEEV */
                        case PHASERS:                   // phasers
                                phasers();
                                if (ididit) hitme = TRUE;
                        case PHASERS:                   // phasers
                                phasers();
                                if (ididit) hitme = TRUE;
@@ -359,11 +366,9 @@ static void makemoves(void) {
                         case SCORE:                // score
                                 score();
                                break;
                         case SCORE:                // score
                                 score();
                                break;
-#ifndef SERGEEV
                        case SENSORS:                   // sensors
                                sensor();
                                break;
                        case SENSORS:                   // sensors
                                sensor();
                                break;
-#endif /* SERGEEV */
                        case ORBIT:                     // orbit
                                orbit();
                                if (ididit) hitme = TRUE;
                        case ORBIT:                     // orbit
                                orbit();
                                if (ididit) hitme = TRUE;
@@ -393,7 +398,7 @@ static void makemoves(void) {
                                eta();
                                break;
                        case COMMANDS:
                                eta();
                                break;
                        case COMMANDS:
-                               listCommands(TRUE);
+                               listCommands(usecurses);
                                break;
                        case EMEXIT:            // Emergency exit
                                clrscr();       // Hide screen
                                break;
                        case EMEXIT:            // Emergency exit
                                clrscr();       // Hide screen
@@ -470,7 +475,7 @@ static void makemoves(void) {
 
 
 int main(int argc, char **argv) {
 
 
 int main(int argc, char **argv) {
-       int i, option, usecurses = TRUE;
+    int i, option;
 
        while ((option = getopt(argc, argv, "t")) != -1) {
            switch (option) {
 
        while ((option = getopt(argc, argv, "t")) != -1) {
            switch (option) {
@@ -492,6 +497,8 @@ int main(int argc, char **argv) {
                strcat(line, " ");
        }
        while (TRUE) { /* Play a game */
                strcat(line, " ");
        }
        while (TRUE) { /* Play a game */
+               setwnd(fullscreen_window);
+               clrscr();
                prelim();
                setup(line[0] == '\0');
                if (alldone) {
                prelim();
                setup(line[0] == '\0');
                if (alldone) {
@@ -512,11 +519,8 @@ int main(int argc, char **argv) {
                }
                proutn("Do you want to play again? ");
                if (!ja()) break;
                }
                proutn("Do you want to play again? ");
                if (!ja()) break;
-               setwnd(FULLSCREEN_WINDOW);
-               clrscr();
        }
        skip(1);
        }
        skip(1);
-       ioend();
        prout("May the Great Bird of the Galaxy roost upon your home planet.");
        return 0;
 }
        prout("May the Great Bird of the Galaxy roost upon your home planet.");
        return 0;
 }
@@ -619,9 +623,9 @@ int scan(void) {
                }
                cgetline(line, sizeof(line));
                 fflush(stdin);
                }
                cgetline(line, sizeof(line));
                 fflush(stdin);
-                if (curwnd==BOTTOM_WINDOW){
+                if (curwnd==prompt_window){
                    clrscr();
                    clrscr();
-                   setwnd(LOWER_WINDOW);
+                   setwnd(message_window);
                    clrscr();
                 }
                linep = line;
                    clrscr();
                 }
                linep = line;