Revert SEED handling and comment orocessing. It broke database compilation.
authorEric S. Raymond <esr@thyrsus.com>
Wed, 24 May 2017 22:24:09 +0000 (18:24 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Wed, 24 May 2017 22:24:09 +0000 (18:24 -0400)
This code is remarkably like the game it implements - a maze of twisty
little FORTRANisms, all alike.  Very easy to get lost.

actions1.c
adventure.text
main.c
main.h
misc.c
misc.h

index 0a1155d800c355058c63506e76519b8c2b7f0891..79c0ea719c497ac138efb711af7b5c68beab3243 100644 (file)
@@ -65,7 +65,6 @@ L4000:        VERB=K;
                case 31: goto L8320;    /* FLY */
                case 32: goto L8330;    /* LISTEN */
                case 33: goto L8340;    /* ZZZZ */
-               case 34: goto L8350;    /* SEED */
        }
        BUG(23);
 
@@ -106,7 +105,6 @@ L4090:      switch (VERB-1) {
                case 31: goto L9320;    /* FLY */
                case 32: return(2011);  /* LISTEN */
                case 33: goto L8340;    /* ZZZZ */
-               case 34: goto L8350;    /* SEED */
        }
        BUG(24);
 
@@ -625,14 +623,4 @@ L8340:     if(!AT(RESER) && LOC != FIXED[RESER]-1) return(2011);
        RSPEAK(241);
         return(2);
 
-/* Seed.  Expected in game logs to replicate the LCG state */
-
-L8350: {
-            long sv;
-            int n;
-            n = sscanf(raw_input, "seed %ld\n", &sv);
-            if (n >= 1)
-                set_seed(sv);
-            return(2);
-        }
 }
index 732be253476c47d849dff8867e9f215ba20cef87..5ec4034e22935c6cac8c229b1506d9c6757951d8 100644 (file)
 2032   FLY
 2033   LISTE
 2034   Z'ZZZ   (GETS REPLACED)
-2035   SEED    (USED IN REPLAY LOGS, NOT INTENDED FOR PLAYER)
 3001   FEE
 3002   FIE
 3003   FOE
diff --git a/main.c b/main.c
index 27130aac1d8735421025b912fafaf9d9915a8782..4854b695f187bb55545f8b5adc0c40f49a5ba56e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -7,7 +7,6 @@
 #include <stdio.h>
 #include <stdbool.h>
 #include <getopt.h>
-#include <string.h>
 #include "main.h"
 
 #include "misc.h"
@@ -18,7 +17,6 @@ long ABB[186], ATAB[331], ATLOC[186], BLKLIN = true, DFLAG,
                PARMS[26], PLACE[101], PTEXT[101], RTEXT[278],
                SETUP = 0, TABSIZ = 330;
 signed char INLINE[LINESIZE+1], MAP1[129], MAP2[129];
-signed char raw_input[LINESIZE+1];
 
 long ABBNUM, ACTSPK[36], AMBER, ATTACK, AXE, BACK, BATTER, BEAR, BIRD, BLOOD, BONUS,
                 BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST, CHLOC, CHLOC2,
@@ -54,11 +52,10 @@ extern int action(FILE *, long);
  * MAIN PROGRAM
  */
 
-static bool do_command(FILE *);
+static void do_command(FILE *);
 
 int main(int argc, char *argv[]) {
        int ch;
-       time_t starttime = time(NULL);
 
 /*  Adventure (rev 2: 20 treasures) */
 
@@ -73,7 +70,7 @@ int main(int argc, char *argv[]) {
        while ((ch = getopt(argc, argv, "l:o")) != EOF) {
                switch (ch) {
                case 'l':
-                       logfp = fopen(optarg, "w");
+                       logfp = fopen(optarg, "w+");
                        if (logfp == NULL)
                                fprintf(stderr,
                                        "advent: can't open logfile %s for write\n",
@@ -102,7 +99,7 @@ int main(int argc, char *argv[]) {
        lcgstate.a = 1093;
        lcgstate.c = 221587;
        lcgstate.m = 1048576;
-       set_seed((long)starttime);
+       set_seed_from_time();
 
 /*  Read the database if we have not yet done so */
 
@@ -135,16 +132,12 @@ L1:       SETUP= -1;
        LIMIT=330;
        if(NOVICE)LIMIT=1000;
 
-       if (logfp)
-           fprintf(logfp, "seed %ld\n", starttime);
        for (;;) {
-           if (!do_command(stdin))
-               break;
+           do_command(stdin);
        }
-       score(1);
 }
 
-static bool do_command(FILE *cmdin) {
+static void do_command(FILE *cmdin) {
 
 /*  Can't leave cave once it's closing (except by main office). */
 
@@ -396,8 +389,7 @@ L2603:      if(!CLOSED) goto L2605;
 L2605: WZDARK=DARK(0);
        if(KNFLOC > 0 && KNFLOC != LOC)KNFLOC=0;
        I=0;
-       if (!GETIN(cmdin, WD1,WD1X,WD2,WD2X))
-           return false;
+       GETIN(cmdin, WD1,WD1X,WD2,WD2X);
 
 /*  Every input, check "FOOBAR" flag.  If zero, nothing's going on.  If pos,
  *  make neg.  If neg, he skipped a word, so make it zero. */
@@ -456,19 +448,8 @@ L2800:     WD1=WD2;
 /*  Gee, I don't understand. */
 
 L3000: SETPRM(1,WD1,WD1X);
-        /* This is a kludge. The command parser we inherited from the base 2.5
-         * barfs on numeric tokens. It will fall through to here when it sees
-         * seed NNNN. Instead of barfing, go straight to the action processor
-         * where it will examine the raw input. This will fo away when we get
-         * rid of the obfuscated FORTRANoid input processing.
-         */
-        if (strncmp(raw_input, "seed", 4) == 0) {
-            I=4090; K=34;
-            goto Laction;
-        } else {
-            RSPEAK(254);
-            goto L2600;
-        }
+       RSPEAK(254);
+        goto L2600;
 
 /* Verb and object analysis moved to separate module. */
 
@@ -477,7 +458,7 @@ L4090:      I=4090; goto Laction;
 L5000: I=5000;
 Laction:
         switch (action(cmdin, I)) {
-          case 2: return true;
+          case 2: return;
           case 8: goto L8;
           case 2000: goto L2000;
           case 2009: goto L2009;
@@ -513,7 +494,7 @@ L8000:      SETPRM(1,WD1,WD1X);
 L8:    KK=KEY[LOC];
        NEWLOC=LOC;
        if(KK == 0)BUG(26);
-       if(K == NUL) return true;
+       if(K == NUL) return;
        if(K == BACK) goto L20;
        if(K == LOOK) goto L30;
        if(K == CAVE) goto L40;
@@ -544,11 +525,11 @@ L13:      if(NEWLOC <= 100) goto L14;
 
 L14:   if(NEWLOC != 0 && !PCT(NEWLOC)) goto L12;
 L16:   NEWLOC=MOD(LL,1000);
-       if(NEWLOC <= 300) return true;
+       if(NEWLOC <= 300) return;
        if(NEWLOC <= 500) goto L30000;
        RSPEAK(NEWLOC-500);
        NEWLOC=LOC;
-        return true;
+        return;
 
 /*  Special motions come here.  Labelling convention: statement numbers NNNXX
  *  (XX=00-99) are used for special case number NNN (NNN=301-500). */
@@ -563,10 +544,10 @@ L30000: NEWLOC=NEWLOC-300;
  *  be used for actual motion, but can be spotted by "go back". */
 
 L30100: NEWLOC=99+100-LOC;
-       if(HOLDNG == 0 || (HOLDNG == 1 && TOTING(EMRALD))) return true;
+       if(HOLDNG == 0 || (HOLDNG == 1 && TOTING(EMRALD))) return;
        NEWLOC=LOC;
        RSPEAK(117);
-       return true;
+        return;
 
 /*  Travel 302.  Plover transport.  Drop the emerald (only use special travel if
  *  toting it), so he's forced to use the plover-passage to get it out.  Having
@@ -590,11 +571,11 @@ L30300: if(PROP[TROLL] != 1) goto L30310;
        MOVE(TROLL+100,FIXD[TROLL]);
        JUGGLE(CHASM);
        NEWLOC=LOC;
-       return true;
+        return;
 
 L30310: NEWLOC=PLAC[TROLL]+FIXD[TROLL]-LOC;
        if(PROP[TROLL] == 0)PROP[TROLL]=1;
-       if(!TOTING(BEAR)) return true;
+       if(!TOTING(BEAR)) return;
        RSPEAK(162);
        PROP[CHASM]=1;
        PROP[TROLL]=2;
@@ -618,7 +599,7 @@ L20:        K=OLDLOC;
        if(CNDBIT(LOC,4))K2=274;
        if(K2 == 0) goto L21;
        RSPEAK(K2);
-       return true;
+        return;
 
 L21:   LL=MOD((IABS(TRAVEL[KK])/1000),1000);
        if(LL == K) goto L25;
@@ -632,7 +613,7 @@ L22:        if(TRAVEL[KK] < 0) goto L23;
 L23:   KK=K2;
        if(KK != 0) goto L25;
        RSPEAK(140);
-       return true;
+        return;
 
 L25:   K=MOD(IABS(TRAVEL[KK]),1000);
        KK=KEY[LOC];
@@ -645,14 +626,14 @@ L30:      if(DETAIL < 3)RSPEAK(15);
        DETAIL=DETAIL+1;
        WZDARK=false;
        ABB[LOC]=0;
-       return true;
+        return;
 
 /*  Cave.  Different messages depending on whether above ground. */
 
 L40:   K=58;
        if(OUTSID(LOC) && LOC != 8)K=57;
        RSPEAK(K);
-       return true;
+        return;
 
 /*  Non-applicable motion.  Various messages depending on word given. */
 
@@ -665,7 +646,11 @@ L50:       SPK=12;
        if(K == 62 || K == 65)SPK=42;
        if(K == 17)SPK=80;
        RSPEAK(SPK);
-       return true;
+        return;
+
+
+
+
 
 /*  "You're dead, Jim."
  *
@@ -879,7 +864,7 @@ L11000: PROP[BOTTLE]=PUT(BOTTLE,115,1);
 
        RSPEAK(132);
        CLOSED=true;
-       return true;
+        return;
 
 /*  Another way we can force an end to things is by having the lamp give out.
  *  When it gets close, we come here to warn him.  We go to 12000 if the lamp
diff --git a/main.h b/main.h
index f4fcf00423595ffd5226e54525368219bccc655f..a71b9e3ff113bce06f1915f1d36daf7e4a5acec3 100644 (file)
--- a/main.h
+++ b/main.h
@@ -11,7 +11,6 @@ extern long ABB[], ATAB[], ATLOC[], BLKLIN, DFLAG, DLOC[], FIXED[], HOLDNG,
                KTAB[], *LINES, LINK[], LNLENG, LNPOSN,
                PARMS[], PLACE[], PTEXT[], RTEXT[], TABSIZ;
 extern signed char INLINE[LINESIZE+1], MAP1[], MAP2[];
-extern signed char raw_input[LINESIZE+1];
 extern FILE *logfp;
 extern bool oldstyle;
 extern lcg_state lcgstate;
diff --git a/misc.c b/misc.c
index 495a339bfcb51563238604789aea72fec991efe2..b87c76913f6aab68b500979b20adce84fb05d443 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -173,7 +173,7 @@ void fSETPRM(long FIRST, long P1, long P2) {
 #define WORD1X (*wORD1X)
 #define WORD2 (*wORD2)
 #define WORD2X (*wORD2X)
-bool fGETIN(FILE *input, long *wORD1, long *wORD1X, long *wORD2, long *wORD2X) {
+void fGETIN(FILE *input, long *wORD1, long *wORD1X, long *wORD2, long *wORD2X) {
 long JUNK;
 
 /*  Get a command from the adventurer.  Snarf out the first word, pad it with
@@ -185,8 +185,7 @@ long JUNK;
 
 L10:   if(BLKLIN)TYPE0();
        MAPLIN(input);
-       if (feof(input))
-           return false;
+       if(input == stdin && feof(stdin)) score(1);
        WORD1=GETTXT(true,true,true,0);
        if(BLKLIN && WORD1 < 0) goto L10;
        WORD1X=GETTXT(false,true,true,0);
@@ -196,7 +195,7 @@ L12:        JUNK=GETTXT(false,true,true,0);
        WORD2X=GETTXT(false,true,true,0);
 L22:   JUNK=GETTXT(false,true,true,0);
        if(JUNK > 0) goto L22;
-       if(GETTXT(true,true,true,0) <= 0)return true;
+       if(GETTXT(true,true,true,0) <= 0)return;
        RSPEAK(53);
         goto L10;
 }
@@ -724,7 +723,7 @@ L2: ATDWRF=I;
 
 
 
-/*  Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value, randrange, RNDVOC, BUG) */
+/*  Utility routines (SETBIT, TSTBIT, set_seed_from_time, get_next_lcg_value, randrange, RNDVOC, BUG) */
 
 #undef SETBIT
 long fSETBIT(long BIT) {
@@ -759,9 +758,11 @@ long TSTBIT;
 
 #define TSTBIT(MASK,BIT) fTSTBIT(MASK,BIT)
 
-void set_seed(long seedval)
+void set_seed_from_time(void)
 {
-       lcgstate.x = (unsigned long) seedval % lcgstate.m;
+  /* Use the current system time to get seed the ISO rand() function, from which we get a seed for the LCG. */
+  srand(time(NULL));
+  lcgstate.x = (unsigned long) rand() % lcgstate.m;
 }
 
 unsigned long get_next_lcg_value(void)
@@ -854,8 +855,8 @@ void fBUG(long NUM) {
 #define BUG(NUM) fBUG(NUM)
 #undef MAPLIN
 void fMAPLIN(FILE *OPENED) {
-       signed char *cp;
-    
+long I, VAL;
+
 /*  Read a line of input, from the specified input source,
  *  translate the chars to integers in the range 0-126 and store
  *  them in the common array "INLINE".  Integer values are as follows:
@@ -883,24 +884,23 @@ void fMAPLIN(FILE *OPENED) {
 
        if(MAP2[1] == 0)MPINIT();
 
-       if (!oldstyle && SETUP && OPENED == stdin)
-               fputs("> ", stdout);
-       do {
-               IGNORE(fgets(raw_input,sizeof(INLINE)-1,OPENED));
-       } while
-               /* allow comments in logfiles */
-               (!feof(OPENED) && raw_input[0] == '#');
+       if (!oldstyle && SETUP)
+           fputs("> ", stdout);
+       IGNORE(fgets(INLINE+1,sizeof(INLINE)-1,OPENED));
        if (feof(OPENED)) {
-               if (logfp && OPENED == stdin)
+               if (logfp)
                        fclose(logfp);
        } else {
                if (logfp)
-                       IGNORE(fputs(raw_input, logfp));
+                       IGNORE(fputs(INLINE+1, logfp));
                else if (!isatty(0))
-                       IGNORE(fputs(raw_input, stdout));
-               for (cp = raw_input; *cp; cp++)
-                       INLINE[cp - raw_input + 1]=MAP1[*cp + 1];
-               LNLENG = (cp - raw_input);
+                       IGNORE(fputs(INLINE+1, stdout));
+               LNLENG=0;
+               for (I=1; I<=sizeof(INLINE) && INLINE[I]!=0; I++) {
+               VAL=INLINE[I]+1;
+               INLINE[I]=MAP1[VAL];
+               if(INLINE[I] != 0)LNLENG=I;
+               } /* end loop */
                LNPOSN=1;
        }
 }
diff --git a/misc.h b/misc.h
index f4567e3b6cfc5eb820450e56c38fef13f228eda8..869c6728580006ac388c83a20122e21b7a76f8df 100644 (file)
--- a/misc.h
+++ b/misc.h
@@ -1,6 +1,5 @@
 #include <time.h>
 #include <stdio.h>
-#include <stdbool.h>
 
 /* b is not needed for POSIX but harmless */
 #define READ_MODE "rb"
@@ -14,7 +13,7 @@ extern void fRSPEAK(long);
 #define RSPEAK(I) fRSPEAK(I)
 extern void fSETPRM(long,long,long);
 #define SETPRM(FIRST,P1,P2) fSETPRM(FIRST,P1,P2)
-extern bool fGETIN(FILE *,long*,long*,long*,long*);
+extern void fGETIN(FILE *,long*,long*,long*,long*);
 #define GETIN(input,WORD1,WORD1X,WORD2,WORD2X) fGETIN(input,&WORD1,&WORD1X,&WORD2,&WORD2X)
 extern long fYES(FILE *,long,long,long);
 #define YES(input,X,Y,Z) fYES(input,X,Y,Z)
@@ -73,6 +72,6 @@ extern long fIABS(long);
 #define IABS(N) fIABS(N)
 extern long fMOD(long,long);
 #define MOD(N,M) fMOD(N,M)
-extern void set_seed(long);
+extern void set_seed_from_time(void);
 extern unsigned long get_next_lcg_value(void);
 extern long randrange(long);