Move a few prototypes and static'ed a few functions
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 54d88b153ec69a61a18674d3e9732d173e1c72d4..3d23c968f7b8fe531c5c7decbc9d1a1699b57284 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,19 +43,17 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                URN, VASE, VEND, VOLCAN, WATER;
 long WD1, WD1X, WD2, WD2X;
 
-FILE  *logfp;
+FILE  *logfp = NULL, *rfp = NULL;
 bool oldstyle = false;
 bool editline = true;
 bool prompt = true;
 
-extern void initialise();
-extern int action(FILE *, long, long, long);
-
-void sig_handler(int signo)
+static void sig_handler(int signo)
 {
-    if (signo == SIGINT)
+    if (signo == SIGINT){
        if (logfp != NULL)
            fflush(logfp);
+       }
     exit(0);
 }
 
@@ -79,7 +77,7 @@ int main(int argc, char *argv[])
        
 /*  Options. */
 
-    while ((ch = getopt(argc, argv, "l:os")) != EOF) {
+    while ((ch = getopt(argc, argv, "l:or:s")) != EOF) {
        switch (ch) {
        case 'l':
            logfp = fopen(optarg, "w");
@@ -93,6 +91,14 @@ int main(int argc, char *argv[])
            oldstyle = true;
            editline = prompt = false;
            break;
+       case 'r':
+           rfp = fopen(optarg, "r");
+           if (rfp == NULL)
+               fprintf(stderr,
+                       "advent: can't open save file %s for read\n",
+                       optarg);
+           signal(SIGINT, sig_handler);
+           break;
        case 's':
            editline = false;
            break;
@@ -125,11 +131,15 @@ int main(int argc, char *argv[])
 
     /*  Start-up, dwarf stuff */
     game.zzword=RNDVOC(3,0);
-    game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,ARB_0);
     game.newloc = LOC_START;
     game.loc = LOC_START;
     game.limit=330;
-    if (game.novice)game.limit=1000;
+    if (!rfp){
+        game.novice=YES(stdin, WELCOME_YOU,CAVE_NEARBY,NO_MESSAGE);
+        if (game.novice)game.limit=1000;
+    } else {
+        restore(rfp);
+    }
 
     if (logfp)
        fprintf(logfp, "seed %ld\n", seedval);
@@ -243,7 +253,7 @@ static void checkhints(FILE *cmdin)
     
                /* Fall through to hint display */
                game.hintlc[hint]=0;
-               if (!YES(cmdin,HINTS[hint][3],ARB_0,OK_MAN))
+               if (!YES(cmdin,HINTS[hint][3],NO_MESSAGE,OK_MAN))
                    return;
                SETPRM(1,HINTS[hint][2],HINTS[hint][2]);
                RSPEAK(HINT_COST);
@@ -255,7 +265,7 @@ static void checkhints(FILE *cmdin)
     }
 }
 
-bool spotted_by_pirate(int i)
+static bool spotted_by_pirate(int i)
 {
     if (i != PIRATE) 
        return false;
@@ -270,15 +280,15 @@ bool spotted_by_pirate(int i)
        return true;
     int snarfed=0;
     bool movechest = false, robplayer = false;
-    for (int j=MINTRS; j<=MAXTRS; j++) {
+    for (int treasure=MINTRS; treasure<=MAXTRS; treasure++) {
        /*  Pirate won't take pyramid from plover room or dark
         *  room (too easy!). */
-       if (j==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) {
+       if (treasure==PYRAM && (game.loc==PLAC[PYRAM] || game.loc==PLAC[EMRALD])) {
            continue;
        }
-       if (TOTING(j) || HERE(j))
+       if (TOTING(treasure) || HERE(treasure))
            ++snarfed;
-       if (TOTING(j)) {
+       if (TOTING(treasure)) {
            movechest = true;
            robplayer = true;
        }
@@ -304,12 +314,12 @@ bool spotted_by_pirate(int i)
     }
     if (robplayer) {
        RSPEAK(PIRATE_POUNCES);
-       for (int j=MINTRS; j<=MAXTRS; j++) {
-           if (!(j == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
-               if (AT(j) && game.fixed[j] == 0)
-                   CARRY(j,game.loc);
-               if (TOTING(j))
-                   DROP(j,game.chloc);
+       for (int treasure=MINTRS; treasure<=MAXTRS; treasure++) {
+           if (!(treasure == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+               if (AT(treasure) && game.fixed[treasure] == 0)
+                   CARRY(treasure,game.loc);
+               if (TOTING(treasure))
+                   DROP(treasure,game.chloc);
            }
        }
     }
@@ -475,14 +485,13 @@ static void croak(FILE *cmdin)
         *  death and exit. */
        RSPEAK(DEATH_CLOSING);
        score(endgame);
-    } else {
-       /* FIXME: Arithmetic on message numbers */
-       if (!YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN))
-           score(endgame);
-       if (game.numdie == MAXDIE)
+
+    }
+    /* FIXME: Arithmetic on message numbers */
+    else if (game.numdie == MAXDIE || !YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN))
            score(endgame);
-       game.place[WATER] = NOWHERE;
-       game.place[OIL] = NOWHERE;
+    else {
+       game.place[WATER] = game.place[OIL] = NOWHERE;
        if (TOTING(LAMP))
            game.prop[LAMP]=0;
        for (int j=1; j<=NOBJECTS; j++) {
@@ -754,7 +763,7 @@ static bool closecheck(void)
        MOVE(TROLL2,PLAC[TROLL]);
        MOVE(TROLL2+NOBJECTS,FIXD[TROLL]);
        JUGGLE(CHASM);
-       if (game.prop[BEAR] != 3)DSTROY(BEAR);
+       if (game.prop[BEAR] != 3)DESTROY(BEAR);
        game.prop[CHAIN]=0;
        game.fixed[CHAIN]=0;
        game.prop[AXE]=0;
@@ -807,7 +816,7 @@ static bool closecheck(void)
 
        for (int i=1; i<=NOBJECTS; i++) {
            if (TOTING(i))
-               DSTROY(i);
+               DESTROY(i);
        }
 
        RSPEAK(CAVE_CLOSED);
@@ -904,8 +913,8 @@ static void listobjects(void)
 static bool do_command(FILE *cmdin)
 /* Get and execute a command */ 
 {
-    long kq, verb, V1, V2;
-    long i, k, kmod;
+    long verb, V1, V2;
+    long kmod, defn;
     static long igo = 0;
     static long obj = 0;
     enum speechpart part;
@@ -923,7 +932,7 @@ static bool do_command(FILE *cmdin)
      *  coming from place forbidden to pirate (dwarves rooted in
      *  place) let him get out (and attacked). */
     if (game.newloc != game.loc && !FORCED(game.loc) && !CNDBIT(game.loc,NOARRR)) {
-       for (i=1; i<=NDWARVES-1; i++) {
+       for (size_t i=1; i<=NDWARVES-1; i++) {
            if (game.odloc[i] == game.newloc && game.dseen[i]) {
                game.newloc=game.loc;
                RSPEAK(DWARF_BLOCK);
@@ -983,7 +992,7 @@ static bool do_command(FILE *cmdin)
        if (game.closed) {
            if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
                PSPEAK(OYSTER,1);
-           for (i=1; i<=NOBJECTS; i++) {
+           for (size_t i=1; i<=NOBJECTS; i++) {
                if (TOTING(i) && game.prop[i] < 0)
                    game.prop[i] = -1-game.prop[i];
            }
@@ -1022,12 +1031,14 @@ static bool do_command(FILE *cmdin)
        } else
            lampcheck();
 
-       k=WHERE_QUERY;
-       if (LIQLOC(game.loc) == WATER)k=FEET_WET;
        V1=VOCAB(WD1,-1);
        V2=VOCAB(WD2,-1);
        if (V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) {
-           RSPEAK(k);
+               if(LIQLOC(game.loc) == WATER){
+                       RSPEAK(FEET_WET);
+               } else {
+                       RSPEAK(WHERE_QUERY);
+               }
            goto L2012;
        }
        if (V1 == ENTER && WD2 > 0) {
@@ -1053,9 +1064,9 @@ static bool do_command(FILE *cmdin)
            if (++igo == 10)
                RSPEAK(GO_UNNEEDED);
        }
-    L2630:
-       i=VOCAB(WD1,-1);
-       if (i == -1) {
+    Lookup:
+       defn = VOCAB(WD1,-1);
+       if (defn == -1) {
            /* Gee, I don't understand. */
            if (fallback_handler(rawbuf))
                continue;
@@ -1063,9 +1074,8 @@ static bool do_command(FILE *cmdin)
            RSPEAK(DONT_KNOW);
            goto L2600;
        }
-       kmod=MOD(i,1000);
-       kq=i/1000+1;
-       switch (kq-1)
+       kmod=MOD(defn,1000);
+       switch (defn/1000)
        {
        case 0:
            if (playermove(cmdin, verb, kmod))
@@ -1089,7 +1099,7 @@ static bool do_command(FILE *cmdin)
        case GO_CLEAROBJ: goto L2012;
        case GO_CHECKHINT: goto L2600;
        case GO_CHECKFOO: goto L2607;
-       case GO_LOOKUP: goto L2630;
+       case GO_LOOKUP: goto Lookup;
        case GO_WORD2:
            /* Get second word for analysis. */
            WD1=WD2;