Get rid of FORTRANisms.
[super-star-trek.git] / sst.c
diff --git a/sst.c b/sst.c
index 72aeedfa662aa1520f4e7ac77628ba46504b32be..23e10016f42312fd7c8994f33b0ecffe3b5f9f58 100644 (file)
--- a/sst.c
+++ b/sst.c
@@ -2,7 +2,6 @@
 #include <ctype.h>
 #include <getopt.h>
 #include <time.h>
-#include "conio.h"
 #include "sstlinux.h"
 #include "sst.h"
 
@@ -10,8 +9,6 @@
 #define SSTDOC "sst.doc"
 #endif
        
-static char line[128], *linep = line;
-
 /*
 
 Here are Tom Almy's changes:
@@ -49,103 +46,114 @@ Here are Tom Almy's changes:
 
    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 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).
 
-    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.
 
-    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.
 
-    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.
 
+   13. Screen-oriented interface, with sensor scans always up.
+
 Eric Raymond's changes:
 
-     1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
+ 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 starbases left in scrscan.
 
    */
 
+/* the input queue */
+static char line[128], *linep = line;
+static int usecurses = TRUE;
+
 static struct 
 {
     char *name;
     int value;
 }
 commands[] = {
-#ifndef SERGEEV
-#define SRSCAN 1
+#define SRSCAN 0
        {"SRSCAN",      SRSCAN},
-       {"STATUS",      SRSCAN},
-#define LRSCAN 2
+#define STATUS 1
+       {"STATUS",      STATUS},
+#define REQUEST        2
+       {"REQUEST",     REQUEST},
+#define LRSCAN 3
        {"LRSCAN",      LRSCAN},
-#endif /* SERGEEV */
-#define PHASERS        3
+#define PHASERS        4
        {"PHASERS",     PHASERS},
-#define TORPEDO        4
+#define TORPEDO        5
         {"TORPEDO",    TORPEDO},
        {"PHOTONS",     TORPEDO},
-#define MOVE   5
+#define MOVE   6
        {"MOVE",        MOVE},
-#define SHIELDS        6
+#define SHIELDS        7
        {"SHIELDS",     SHIELDS},
-#define DOCK   7
+#define DOCK   8
        {"DOCK",        DOCK},
-#define DAMAGES        8
+#define DAMAGES        9
        {"DAMAGES",     DAMAGES},
-#define CHART  9
+#define CHART  10
        {"CHART",       CHART},
-#define IMPULSE        10
+#define IMPULSE        11
        {"IMPULSE",     IMPULSE},
-#define REST   11
+#define REST   12
        {"REST",        REST},
-#define WARP   12
+#define WARP   13
        {"WARP",        WARP},
-#define SCORE  13
+#define SCORE  14
        {"SCORE",       SCORE},
-#ifndef SERGEEV
-#define SENSORS        14
+#define SENSORS        15
        {"SENSORS",     SENSORS},
-#endif /* SERGEEV */
-#define ORBIT  15
+#define ORBIT  16
        {"ORBIT",       ORBIT},
-#define TRANSPORT      16
+#define TRANSPORT      17
        {"TRANSPORT",   TRANSPORT},
-#define MINE   17
+#define MINE   18
        {"MINE",        MINE},
-#define CRYSTALS 18
+#define CRYSTALS       19
        {"CRYSTALS",    CRYSTALS},
-#define SHUTTLE        19
+#define SHUTTLE        20
        {"SHUTTLE",     SHUTTLE},
-#define PLANETS        20
+#define PLANETS        21
        {"PLANETS",     PLANETS},
-#define REPORT 21
+#define REPORT 22
        {"REPORT",      REPORT},
 #define COMPUTER       23
        {"COMPUTER",    COMPUTER},
@@ -160,9 +168,9 @@ commands[] = {
        {"FREEZE",      SAVE},
 #define ABANDON        28
        {"ABANDON",     ABANDON},
-#define DESTRUCT 29
+#define DESTRUCT       29
        {"DESTRUCT",    DESTRUCT},
-#define DEATHRAY 30
+#define DEATHRAY       30
        {"DEATHRAY",    DEATHRAY},
 #define DEBUGCMD       31
        {"DEBUG",       DEBUGCMD},
@@ -178,13 +186,16 @@ commands[] = {
 
 #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);
+       proutn("%-12s ", commands[i].name); 
+       k++;
     }
     skip(1);
 }
@@ -199,15 +210,11 @@ static void helpme(void) {
        key = scan();
        while (TRUE) {
                if (key == IHEOL) {
-#ifdef SERGEEV
-                        setwnd(BOTTOM_WINDOW);
-#endif /* SERGEEV */
+                        setwnd(prompt_window);
                         proutn("Help on what command? ");
                        key = scan();
                }
-#ifdef SERGEEV
-                setwnd(LOWER_WINDOW);
-#endif /* SERGEEV */
+                setwnd(message_window);
                if (key == IHEOL) return;
                for (i = 0; i < NUMCOMMANDS; i++) {
                    if (strcasecmp(commands[i].name, citem)==0) {
@@ -218,7 +225,7 @@ static void helpme(void) {
                if (i != NUMCOMMANDS) break;
                skip(1);
                prout("Valid commands:");
-               listCommands(FALSE);
+               listCommands(usecurses);
                key = IHEOL;
                chew();
                skip(1);
@@ -263,39 +270,19 @@ static void helpme(void) {
        while (fgets(linebuf, sizeof(linebuf),fp)) {
                if (strstr(linebuf, "******"))
                        break;
-               proutc(linebuf);
+               proutn(linebuf);
        }
        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(LEFTUPPER_WINDOW);
-     gotoxy(1,1);
-     strcpy(line,"s");
-     srscan(1);
-     if (l!=2){
-        setwnd(SRSCAN_WINDOW);
-        clrscr();
-        srscan(2);
-        setwnd(LRSCAN_WINDOW);
-        clrscr();
-        strcpy(line,"l");
-        lrscan();
-        _setcursortype(_NORMALCURSOR);
-     }
-#endif /* SERGEEV */
+void enqueue(char *s) {
+    strcpy(line, s);
 }
 
 static void makemoves(void) {
        int i, hitme;
-#ifdef SERGEEV
         clrscr();
-        setwnd(LOWER_WINDOW);
-#endif /* SERGEEV */
+        setwnd(message_window);
        while (TRUE) { /* command loop */
                 drawmaps(1);
                 while (TRUE)  { /* get a command */
@@ -304,27 +291,17 @@ static void makemoves(void) {
                        Time = 0.0;
                        i = -1;
                        chew();
-#ifdef SERGEEV
-                        setwnd(BOTTOM_WINDOW);
+                        setwnd(prompt_window);
                         clrscr();
-#endif /* SERGEEV */
                        proutn("COMMAND> ");
                         if (scan() == IHEOL) {
-#ifdef SERGEEV
-                            _setcursortype(_NOCURSOR);
-                            setwnd(LOWER_WINDOW);
-                            clrscr();
-                            chart(0);
-                            _setcursortype(_NORMALCURSOR);
-#endif /* SERGEEV */
+                           makechart();
                             continue;
                         }
-#ifdef SERGEEV
                         ididit=0;
                         clrscr();
-                        setwnd(LOWER_WINDOW);
+                        setwnd(message_window);
                         clrscr();
-#endif /* SERGEEV */
                        for (i=0; i < ABANDON; i++)
                            if (isit(commands[i].name)) {
                                i = commands[i].value;
@@ -337,19 +314,22 @@ static void makemoves(void) {
                                    break;
                            }
                        if (i < NUMCOMMANDS) break;
-
-                       listCommands(TRUE);
+                       listCommands(usecurses);
                }
                commandhook(commands[i].name, TRUE);
                switch (i) { /* command switch */
-#ifndef SERGEEV
                         case SRSCAN:                 // srscan
-                               srscan(1);
+                               srscan(SCAN_FULL);
+                               break;
+                        case STATUS:                 // status
+                               srscan(SCAN_STATUS);
                                break;
+                       case REQUEST:                   // status request 
+                               srscan(SCAN_REQUEST);
+                               break;
                        case LRSCAN:                    // lrscan
                                lrscan();
                                 break;
-#endif /* SERGEEV */
                        case PHASERS:                   // phasers
                                phasers();
                                if (ididit) hitme = TRUE;
@@ -391,11 +371,9 @@ static void makemoves(void) {
                         case SCORE:                // score
                                 score();
                                break;
-#ifndef SERGEEV
                        case SENSORS:                   // sensors
                                sensor();
                                break;
-#endif /* SERGEEV */
                        case ORBIT:                     // orbit
                                orbit();
                                if (ididit) hitme = TRUE;
@@ -425,7 +403,7 @@ static void makemoves(void) {
                                eta();
                                break;
                        case COMMANDS:
-                               listCommands(TRUE);
+                               listCommands(usecurses);
                                break;
                        case EMEXIT:            // Emergency exit
                                clrscr();       // Hide screen
@@ -444,10 +422,8 @@ static void makemoves(void) {
                                break;
                        case SAVE:                      // Save Game
                                freeze(FALSE);
-#ifdef SERGEEV
                                 clrscr();
-#endif /* SERGEEV */
-                               if (skill > 3)
+                               if (skill > SKILL_GOOD)
                                         prout("WARNING--Saved games produce no plaques!");
                                break;
                        case DEATHRAY:          // Try a desparation measure
@@ -483,14 +459,14 @@ static void makemoves(void) {
                                events();
                                if (alldone) break;             // Events did us in
                        }
-                       if (game.state.galaxy[quadx][quady] == 1000) { // Galaxy went Nova!
+                       if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) { // Galaxy went Nova!
                                atover(0);
                                continue;
                        }
                        if (hitme && justin==0) {
                                attack(2);
                                if (alldone) break;
-                               if (game.state.galaxy[quadx][quady] == 1000) {  // went NOVA! 
+                               if (game.state.galaxy[quadx][quady] == SUPERNOVA_PLACE) {       // went NOVA! 
                                        atover(0);
                                        hitme = TRUE;
                                        continue;
@@ -504,7 +480,7 @@ static void makemoves(void) {
 
 
 int main(int argc, char **argv) {
-       int i, option, usecurses = TRUE;
+    int i, option;
 
        while ((option = getopt(argc, argv, "t")) != -1) {
            switch (option) {
@@ -517,20 +493,17 @@ int main(int argc, char **argv) {
            }
        }
 
-#ifndef SERGEEV
-       iostart(usecurses);
-#else
        randomize();
-        textattr(7);
-        clrscr();
-        setwnd(FULLSCREEN_WINDOW);
-#endif /* SERGEEV */
+       iostart(usecurses);
+
        line[0] = '\0';
        for (i = optind; i < argc;  i++) {
                strcat(line, argv[i]);
                strcat(line, " ");
        }
        while (TRUE) { /* Play a game */
+               setwnd(fullscreen_window);
+               clrscr();
                prelim();
                setup(line[0] == '\0');
                if (alldone) {
@@ -551,15 +524,8 @@ int main(int argc, char **argv) {
                }
                proutn("Do you want to play again? ");
                if (!ja()) break;
-#ifdef SERGEEV
-               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;
 }
@@ -625,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) {
@@ -661,14 +622,12 @@ int scan(void) {
                        return IHEOL;
                }
                cgetline(line, sizeof(line));
-#ifdef SERGEEV
                 fflush(stdin);
-                if (curwnd==BOTTOM_WINDOW){
+                if (curwnd==prompt_window){
                    clrscr();
-                   setwnd(LOWER_WINDOW);
+                   setwnd(message_window);
                    clrscr();
                 }
-#endif /* SERGEEV */
                linep = line;
        }
        // Skip leading white space