Make the internal pager actually work. In the process, remove getch()
[super-star-trek.git] / sst.c
diff --git a/sst.c b/sst.c
index f6db8870c9ae1856cf8eb55d345ac0981475a7c6..5fc099739e6b9aaaba8fa67de1ce427f04d0606c 100644 (file)
--- a/sst.c
+++ b/sst.c
@@ -1,15 +1,19 @@
 #define INCLUDED       // Define externs here\r
 #include "sst.h"\r
 #include <ctype.h>\r
 #define INCLUDED       // Define externs here\r
 #include "sst.h"\r
 #include <ctype.h>\r
+#include <stdarg.h>\r
 #ifdef MSDOS\r
 #include <dos.h>\r
 #endif\r
 #include <time.h>\r
 #ifdef MSDOS\r
 #include <dos.h>\r
 #endif\r
 #include <time.h>\r
-       \r
-int getch(void);\r
 \r
 \r
+#ifndef SSTDOC\r
+#define SSTDOC "sst.doc"\r
+#endif\r
+       \r
 static char line[128], *linep = line;\r
 static int linecount;  /* for paging */\r
 static char line[128], *linep = line;\r
 static int linecount;  /* for paging */\r
+static int screenheight = 24;\r
 \r
 static void clearscreen(void);\r
 \r
 \r
 static void clearscreen(void);\r
 \r
@@ -38,7 +42,7 @@ static void clearscreen(void);
    2. deathray improvement (but keeping original failure alternatives)\r
 \r
    3. Tholian Web\r
    2. deathray improvement (but keeping original failure alternatives)\r
 \r
    3. Tholian Web\r
-\r
+s\r
    4. Enemies can ram the Enterprise. Regular Klingons and Romulans can\r
       move in Expert and Emeritus games. This code could use improvement.\r
 \r
    4. Enemies can ram the Enterprise. Regular Klingons and Romulans can\r
       move in Expert and Emeritus games. This code could use improvement.\r
 \r
@@ -102,7 +106,7 @@ static void listCommands(int x) {
 \r
 static void helpme(void) {\r
        int i, j;\r
 \r
 static void helpme(void) {\r
        int i, j;\r
-       char cmdbuf[32];\r
+       char cmdbuf[32], *cp;\r
        char linebuf[132];\r
        FILE *fp;\r
        /* Give help on commands */\r
        char linebuf[132];\r
        FILE *fp;\r
        /* Give help on commands */\r
@@ -129,37 +133,41 @@ static void helpme(void) {
                strcpy(cmdbuf, " ABBREV");\r
        }\r
        else {\r
                strcpy(cmdbuf, " ABBREV");\r
        }\r
        else {\r
-               strcpy(cmdbuf, "  Mnemonic:  ");\r
-               j = 0;\r
-               while ((cmdbuf[j+13] = toupper(commands[i][j])) != 0) j++;\r
+           for (j = 0; commands[i][j]; j++)\r
+               cmdbuf[j] = toupper(commands[i][j]);\r
+           cmdbuf[j] = '\0';\r
        }\r
        }\r
-       fp = fopen("sst.doc", "r");\r
+       fp = fopen(SSTDOC, "r");\r
        if (fp == NULL) {\r
                prout("Spock-  \"Captain, that information is missing from the");\r
                prout("   computer. You need to find SST.DOC and put it in the");\r
                prout("   current directory.\"");\r
                return;\r
        }\r
        if (fp == NULL) {\r
                prout("Spock-  \"Captain, that information is missing from the");\r
                prout("   computer. You need to find SST.DOC and put it in the");\r
                prout("   current directory.\"");\r
                return;\r
        }\r
-       i = strlen(cmdbuf);\r
-       do {\r
-               if (fgets(linebuf, 132, fp) == NULL) {\r
+       for (;;) {\r
+           if (fgets(linebuf, sizeof(linebuf), fp) == NULL) {\r
                        prout("Spock- \"Captain, there is no information on that command.\"");\r
                        fclose(fp);\r
                        return;\r
                }\r
                        prout("Spock- \"Captain, there is no information on that command.\"");\r
                        fclose(fp);\r
                        return;\r
                }\r
-       } while (strncmp(linebuf, cmdbuf, i) != 0);\r
+           if (linebuf[0] == '%' && linebuf[1] == '%'&& linebuf[2] == ' ') {\r
+               for (cp = linebuf+3; isspace(*cp); cp++)\r
+                       continue;\r
+               linebuf[strlen(linebuf)-1] = '\0';\r
+               if (strcmp(cp, cmdbuf) == 0)\r
+                   break;\r
+           }\r
+       }\r
 \r
        skip(1);\r
        prout("Spock- \"Captain, I've found the following information:\"");\r
        skip(1);\r
 \r
 \r
        skip(1);\r
        prout("Spock- \"Captain, I've found the following information:\"");\r
        skip(1);\r
 \r
-       do {\r
-               if (linebuf[0]!=12) { // ignore page break lines \r
-                       linebuf[strlen(linebuf)-1] = '\0'; // No \n at end\r
-                       prout(linebuf);\r
-               }\r
-               fgets(linebuf,132,fp);\r
-       } while (strstr(linebuf, "******")==NULL);\r
+       while (fgets(linebuf, sizeof(linebuf),fp)) {\r
+               if (strstr(linebuf, "******"))\r
+                       break;\r
+               proutc(linebuf);\r
+       }\r
        fclose(fp);\r
 }\r
 \r
        fclose(fp);\r
 }\r
 \r
@@ -349,20 +357,21 @@ int main(int argc, char **argv) {
        int hitme;\r
        char ch;\r
        prelim();\r
        int hitme;\r
        char ch;\r
        prelim();\r
+       char *LINES = getenv("LINES");\r
\r
+       if (LINES)\r
+           screenheight = atoi(LINES);\r
 \r
 \r
+       line[0] = '\0';\r
        if (argc > 1) {\r
        if (argc > 1) {\r
-               fromcommandline = 1;\r
-               line[0] = '\0';\r
                while (--argc > 0) {\r
                        strcat(line, *(++argv));\r
                        strcat(line, " ");\r
                }\r
        }\r
                while (--argc > 0) {\r
                        strcat(line, *(++argv));\r
                        strcat(line, " ");\r
                }\r
        }\r
-       else fromcommandline = 0;\r
-\r
 \r
        while (TRUE) { /* Play a game */\r
 \r
        while (TRUE) { /* Play a game */\r
-               setup();\r
+               setup(line[0] == '\0');\r
                if (alldone) {\r
                        score();\r
                        alldone = 0;\r
                if (alldone) {\r
                        score();\r
                        alldone = 0;\r
@@ -373,13 +382,13 @@ int main(int argc, char **argv) {
                skip(1);\r
 \r
                if (tourn && alldone) {\r
                skip(1);\r
 \r
                if (tourn && alldone) {\r
-                       printf("Do you want your score recorded?");\r
+                       proutn("Do you want your score recorded?");\r
                        if (ja()) {\r
                                chew2();\r
                                freeze(FALSE);\r
                        }\r
                }\r
                        if (ja()) {\r
                                chew2();\r
                                freeze(FALSE);\r
                        }\r
                }\r
-               printf("Do you want to play again?");\r
+               proutn("Do you want to play again?");\r
                if (!ja()) break;\r
        }\r
        skip(1);\r
                if (!ja()) break;\r
        }\r
        skip(1);\r
@@ -407,20 +416,20 @@ void cramen(int i) {
        proutn(s);\r
 }\r
 \r
        proutn(s);\r
 }\r
 \r
-void cramlc(int key, int x, int y) {\r
-       if (key == 1) proutn(" Quadrant");\r
-       else if (key == 2) proutn(" Sector");\r
-       proutn(" ");\r
-       crami(x, 1);\r
-       proutn(" - ");\r
-       crami(y, 1);\r
+char *cramlc(enum loctype key, int x, int y) {\r
+       static char buf[32];\r
+       buf[0] = '\0';\r
+       if (key == quadrant) strcpy(buf, "Quadrant ");\r
+       else if (key == sector) strcpy(buf, "Sector ");\r
+       sprintf(buf+strlen(buf), "%d-%d", x, y);\r
+       return buf;\r
 }\r
 \r
 void crmena(int i, int enemy, int key, int x, int y) {\r
        if (i == 1) proutn("***");\r
        cramen(enemy);\r
        proutn(" at");\r
 }\r
 \r
 void crmena(int i, int enemy, int key, int x, int y) {\r
        if (i == 1) proutn("***");\r
        cramen(enemy);\r
        proutn(" at");\r
-       cramlc(key, x, y);\r
+       proutn(cramlc(key, x, y));\r
 }\r
 \r
 void crmshp(void) {\r
 }\r
 \r
 void crmshp(void) {\r
@@ -530,18 +539,6 @@ int ja(void) {
        }\r
 }\r
 \r
        }\r
 }\r
 \r
-void cramf(double x, int w, int d) {\r
-       char buf[64];\r
-       sprintf(buf, "%*.*f", w, d, x);\r
-       proutn(buf);\r
-}\r
-\r
-void crami(int i, int w) {\r
-       char buf[16];\r
-       sprintf(buf, "%*d", w, i);\r
-       proutn(buf);\r
-}\r
-\r
 double square(double i) { return i*i; }\r
                                                                        \r
 static void clearscreen(void) {\r
 double square(double i) { return i*i; }\r
                                                                        \r
 static void clearscreen(void) {\r
@@ -550,29 +547,33 @@ static void clearscreen(void) {
        extern void clrscr(void);\r
        clrscr();\r
 #else\r
        extern void clrscr(void);\r
        clrscr();\r
 #else\r
-       proutn("\033[2J");      /* Hope for an ANSI display */\r
+       // proutn("\033[2J");   /* Hope for an ANSI display */\r
+       /* much more in that old-time TTY spirit to just throw linefeeds */\r
+       int i;\r
+       for (i = 0; i < screenheight; i++)\r
+           putchar('\n');\r
 #endif\r
 }\r
 \r
 /* We will pull these out in case we want to do something special later */\r
 \r
 void pause(int i) {\r
 #endif\r
 }\r
 \r
 /* We will pull these out in case we want to do something special later */\r
 \r
 void pause(int i) {\r
+       char buf[BUFSIZ];\r
        putchar('\n');\r
        if (i==1) {\r
                if (skill > 2)\r
                        prout("[ANOUNCEMENT ARRIVING...]");\r
                else\r
        putchar('\n');\r
        if (i==1) {\r
                if (skill > 2)\r
                        prout("[ANOUNCEMENT ARRIVING...]");\r
                else\r
-                       prout("[IMPORTANT ANNOUNCEMENT ARRIVING -- HIT SPACE BAR TO CONTINUE]");\r
-               getch();\r
+                       prout("[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]");\r
        }\r
        else {\r
        }\r
        else {\r
-               if (skill > 2)\r
-                       proutn("[CONTINUE?]");\r
-               else\r
-                       proutn("[HIT SPACE BAR TO CONTINUE]");\r
-               getch();\r
-               proutn("\r                           \r");\r
+               if (skill > 2)\r
+                       proutn("[CONTINUE?]");\r
+               else\r
+                       proutn("[PRESS ENTER TO CONTINUE]");\r
+\r
        }\r
        }\r
+       fgets(buf, sizeof(buf), stdin);\r
        if (i != 0) {\r
                clearscreen();\r
        }\r
        if (i != 0) {\r
                clearscreen();\r
        }\r
@@ -583,7 +584,7 @@ void pause(int i) {
 void skip(int i) {\r
        while (i-- > 0) {\r
                linecount++;\r
 void skip(int i) {\r
        while (i-- > 0) {\r
                linecount++;\r
-               if (linecount >= 23)\r
+               if (linecount >= screenheight)\r
                        pause(0);\r
                else\r
                        putchar('\n');\r
                        pause(0);\r
                else\r
                        putchar('\n');\r
@@ -591,22 +592,40 @@ void skip(int i) {
 }\r
 \r
 \r
 }\r
 \r
 \r
-void proutn(char *s) {\r
-       fputs(s, stdout);\r
+void proutn(char *fmt, ...) {\r
+    va_list ap;\r
+    va_start(ap, fmt);\r
+    vprintf(fmt, ap);\r
+    va_end(ap);\r
 }\r
 \r
 }\r
 \r
-void prout(char *s) {\r
-       proutn(s);\r
-       skip(1);\r
+void prout(char *fmt, ...) {\r
+    va_list ap;\r
+    va_start(ap, fmt);\r
+    vprintf(fmt, ap);\r
+    va_end(ap);\r
+    skip(1);\r
 }\r
 \r
 }\r
 \r
-void prouts(char *s) {\r
+void proutc(char *line) {\r
+    line[strlen(line)-1] = '\0';\r
+    fputs(line, stdout);\r
+    skip(1);\r
+}\r
+\r
+void prouts(char *fmt, ...) {\r
        clock_t endTime;\r
        clock_t endTime;\r
+       char *s, buf[BUFSIZ];\r
        /* print slowly! */\r
        /* print slowly! */\r
-       while (*s) {\r
+       va_list ap;\r
+       va_start(ap, fmt);\r
+       vsprintf(buf, fmt, ap);\r
+       va_end(ap);\r
+       skip(1);\r
+       for (s = buf; *s; s++) {\r
                endTime = clock() + CLOCKS_PER_SEC*0.05;\r
                while (clock() < endTime) ;\r
                endTime = clock() + CLOCKS_PER_SEC*0.05;\r
                while (clock() < endTime) ;\r
-               putchar(*s++);\r
+               putchar(*s);\r
                fflush(stdout);\r
        }\r
 }\r
                fflush(stdout);\r
        }\r
 }\r
@@ -676,7 +695,7 @@ void debugme(void) {
                                case FSCMOVE: proutn("SC Move         "); break;\r
                                case FSCDBAS: proutn("SC Base Destroy "); break;\r
                        }\r
                                case FSCMOVE: proutn("SC Move         "); break;\r
                                case FSCDBAS: proutn("SC Base Destroy "); break;\r
                        }\r
-                       cramf(future[i]-game.state.date, 8, 2);\r
+                       proutn("%.2f", future[i]-game.state.date);\r
                        chew();\r
                        proutn("  ?");\r
                        key = scan();\r
                        chew();\r
                        proutn("  ?");\r
                        key = scan();\r