Resume from file on startup
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 1c1b299017a91b740e9b8def7cef69d04eb1ac09..a6fea59070fffdc6d5e3cc6ec759862f3b61ae46 100644 (file)
--- a/main.c
+++ b/main.c
@@ -43,20 +43,20 @@ 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 void score(long);
 extern int action(FILE *, long, long, long);
 
 void sig_handler(int signo)
 {
-    if (signo == SIGINT)
+    if (signo == SIGINT){
        if (logfp != NULL)
            fflush(logfp);
+       }
     exit(0);
 }
 
@@ -80,7 +80,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");
@@ -94,6 +94,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;
@@ -126,11 +134,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);
@@ -141,7 +153,7 @@ int main(int argc, char *argv[])
            break;
     }
     /* show score and exit */
-    score(1);
+    score(quitgame);
 }
 
 static bool fallback_handler(char *buf)
@@ -244,13 +256,13 @@ 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);
                game.hinted[hint]=YES(cmdin,WANT_HINT,HINTS[hint][4],OK_MAN);
-               if (game.hinted[hint] && game.limit > 30)
-                   game.limit=game.limit+30*HINTS[hint][2];
+               if (game.hinted[hint] && game.limit > WARNTIME)
+                   game.limit += WARNTIME*HINTS[hint][2];
            }
        }
     }
@@ -263,8 +275,8 @@ bool spotted_by_pirate(int i)
 
     /*  The pirate's spotted him.  He leaves him alone once we've
      *  found chest.  K counts if a treasure is here.  If not, and
-     *  tally=1 for an unseen chest, let the pirate be spotted.
-     *  Note that game.place[CHEST]=0 might mean that he's thrown
+     *  tally=1 for an unseen chest, let the pirate be spotted.  Note
+     *  that game.place[CHEST] = NOWHERE might mean that he's thrown
      *  it to the troll, but in that case he's seen the chest
      *  (game.prop=0). */
     if (game.loc == game.chloc || game.prop[CHEST] >= 0)
@@ -285,7 +297,7 @@ bool spotted_by_pirate(int i)
        }
     }
     /* Force chest placement before player finds last treasure */
-    if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == 0 && HERE(LAMP) && game.prop[LAMP] == 1) {
+    if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) {
        RSPEAK(PIRATE_SPOTTED);
        movechest = true;
     }
@@ -475,15 +487,14 @@ static void croak(FILE *cmdin)
        /*  He died during closing time.  No resurrection.  Tally up a
         *  death and exit. */
        RSPEAK(DEATH_CLOSING);
-       score(0);
-    } else {
-       /* FIXME: Arithmetic on message numbers */
-       if (!YES(cmdin,WATCH_IT+game.numdie*2,WHICH_WAY+game.numdie*2,OK_MAN))
-           score(0);
-       if (game.numdie == MAXDIE)
-           score(0);
-       game.place[WATER]=0;
-       game.place[OIL]=0;
+       score(endgame);
+
+    }
+    /* 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);
+    else {
+       game.place[WATER] = game.place[OIL] = NOWHERE;
        if (TOTING(LAMP))
            game.prop[LAMP]=0;
        for (int j=1; j<=NOBJECTS; j++) {
@@ -755,7 +766,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;
@@ -808,7 +819,7 @@ static bool closecheck(void)
 
        for (int i=1; i<=NOBJECTS; i++) {
            if (TOTING(i))
-               DSTROY(i);
+               DESTROY(i);
        }
 
        RSPEAK(CAVE_CLOSED);
@@ -832,7 +843,7 @@ static void lampcheck(void)
      *  Second is for other cases of lamp dying.  12400 is when it
      *  goes out.  Even then, he can explore outside for a while
      *  if desired. */
-    if (game.limit<=30 && HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP))
+    if (game.limit <= WARNTIME && HERE(BATTER) && game.prop[BATTER]==0 && HERE(LAMP))
     {
        RSPEAK(REPLACE_BATTERIES);
        game.prop[BATTER]=1;
@@ -845,11 +856,11 @@ static void lampcheck(void)
        game.prop[LAMP]=0;
        if (HERE(LAMP))
            RSPEAK(LAMP_OUT);
-    } else if (game.limit <= 30) {
+    } else if (game.limit <= WARNTIME) {
        if (!game.lmwarn && HERE(LAMP)) {
            game.lmwarn=true;
            int spk=GET_BATTERIES;
-           if (game.place[BATTER] == 0)spk=LAMP_DIM;
+           if (game.place[BATTER] == NOWHERE)spk=LAMP_DIM;
            if (game.prop[BATTER] == 1)spk=MISSING_BATTERIES;
            RSPEAK(spk);
        }
@@ -1059,7 +1070,7 @@ static bool do_command(FILE *cmdin)
        if (i == -1) {
            /* Gee, I don't understand. */
            if (fallback_handler(rawbuf))
-               return true;
+               continue;
            SETPRM(1,WD1,WD1X);
            RSPEAK(DONT_KNOW);
            goto L2600;
@@ -1107,7 +1118,7 @@ static bool do_command(FILE *cmdin)
        case GO_DWARFWAKE:
            /*  Oh dear, he's disturbed the dwarves. */
            RSPEAK(DWARVES_AWAKEN);
-           score(0);
+           score(endgame);
            return true;
        default:
            BUG(99);