SPK is no longer global.
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index 8e40605cd4f0dd6d3773b1295ede8bdf789389e1..e10239833a1f72c6156294ef3d5faf21364d09fd 100644 (file)
--- a/main.c
+++ b/main.c
@@ -21,6 +21,7 @@
 #include "advent.h"
 #include "database.h"
 #include "linenoise/linenoise.h"
+#include "newdb.h"
 
 struct game_t game;
 
@@ -38,7 +39,7 @@ long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
                RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
                STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
                URN, VASE, VEND, VOLCAN, WATER;
-long K, SPK, WD1, WD1X, WD2, WD2X;
+long K, WD1, WD1X, WD2, WD2X;
 
 FILE  *logfp;
 bool oldstyle = false;
@@ -566,49 +567,48 @@ static bool playermove(FILE *cmdin, token_t verb)
        if (TRAVEL[KK] < 0) {
            /*  Non-applicable motion.  Various messages depending on
             *  word given. */
-           SPK=12;
-           if (K >= 43 && K <= 50)SPK=52;
-           if (K == 29 || K == 30)SPK=52;
-           if (K == 7 || K == 36 || K == 37)SPK=10;
-           if (K == 11 || K == 19)SPK=11;
-           if (verb == FIND || verb == INVENT)SPK=59;
-           if (K == 62 || K == 65)SPK=42;
-           if (K == 17)SPK=80;
-           RSPEAK(SPK);
+           int spk=12;
+           if (K >= 43 && K <= 50)spk=52;
+           if (K == 29 || K == 30)spk=52;
+           if (K == 7 || K == 36 || K == 37)spk=10;
+           if (K == 11 || K == 19)spk=11;
+           if (verb == FIND || verb == INVENT)spk=59;
+           if (K == 62 || K == 65)spk=42;
+           if (K == 17)spk=80;
+           RSPEAK(spk);
            return true;
        }
        ++KK;
     }
     LL=LL/1000;
 
-L11:
-    game.newloc=LL/1000;
-    K=MOD(game.newloc,100);
-    if (game.newloc <= 300) {
-       if (game.newloc <= 100)
-           goto L14;
-       if (TOTING(K) || (game.newloc > 200 && AT(K)))
-           goto L16;
-       goto L12;
+    for (;;) {
+       game.newloc=LL/1000;
+       K=MOD(game.newloc,100);
+       if (game.newloc <= 300) {
+           if (game.newloc <= 100) {
+               if (game.newloc == 0 || PCT(game.newloc))
+                   break;
+               /* else fall through */
+           } if (TOTING(K) || (game.newloc > 200 && AT(K)))
+                 break;
+           /* else fall through */
+       }
+       else if (game.prop[K] != game.newloc/100-3)
+           break;
+    L12:
+       do {
+           if (TRAVEL[KK] < 0)BUG(25);
+           ++KK;
+           game.newloc=labs(TRAVEL[KK])/1000;
+       } while
+           (game.newloc == LL);
+       LL=game.newloc;
     }
-    if (game.prop[K] != game.newloc/100-3)
-       goto L16;
-L12:
-    do {
-       if (TRAVEL[KK] < 0)BUG(25);
-       ++KK;
-       game.newloc=labs(TRAVEL[KK])/1000;
-    } while
-        (game.newloc == LL);
-    LL=game.newloc;
-    goto L11;
 
-L14:
-    if (game.newloc != 0 && !PCT(game.newloc))
-       goto L12;
-L16:
     game.newloc=MOD(LL,1000);
-    if (game.newloc <= 300) return true;
+    if (game.newloc <= 300)
+       return true;
     if (game.newloc <= 500) {
        game.newloc=game.newloc-300;
        switch (game.newloc)
@@ -710,10 +710,10 @@ static bool do_command(FILE *cmdin)
 
 L2000: if (game.loc == 0)
            croak(cmdin);
-       KK=STEXT[game.loc];
-       if (MOD(game.abbrev[game.loc],game.abbnum) == 0 || KK == 0)
-           KK=LTEXT[game.loc];
-       if (!FORCED(game.loc) && DARK(0)) {
+       char* msg = short_location_descriptions[game.loc];
+       if (MOD(game.abbrev[game.loc],game.abbnum) == 0 || msg == 0)
+           msg=long_location_descriptions[game.loc];
+       if (!FORCED(game.loc) && DARK(game.loc)) {
            /*  The easiest way to get killed is to fall into a pit in
             *  pitch darkness. */
            if (game.wzdark && PCT(35)) {
@@ -722,13 +722,14 @@ L2000:    if (game.loc == 0)
                croak(cmdin);
                goto L2000;
            }
-           KK=RTEXT[16];
+           msg=arbitrary_messages[16];
        }
        if (TOTING(BEAR))RSPEAK(141);
-       SPEAK(KK);
+       newspeak(msg);
        K=1;
-       if (FORCED(game.loc))
+       if (FORCED(game.loc)) {
            goto L8;
+       }
        if (game.loc == 33 && PCT(25) && !game.closng)RSPEAK(7);
 
        /*  Print out descriptions of objects at this location.  If
@@ -739,7 +740,7 @@ L2000:      if (game.loc == 0)
         *  bear).  These hacks are because game.prop=0 is needed to
         *  get full score. */
 
-       if (DARK(0)) goto L2012;
+       if (DARK(game.loc)) goto L2012;
        ++game.abbrev[game.loc];
        i=game.atloc[game.loc];
 L2004: if (i == 0) goto L2012;
@@ -768,10 +769,6 @@ L2006:     KK=game.prop[obj];
 L2008: i=game.link[i];
         goto L2004;
 
-L2009: K=54;
-L2010: SPK=K;
-L2011: RSPEAK(SPK);
-
 L2012: VERB=0;
        game.oldobj=obj;
        obj=0;
@@ -797,7 +794,7 @@ L2600:      if (COND[game.loc] >= game.conds) {
         *  objects won't be described until they've been picked up
         *  and put down separate from their respective piles.  Don't
         *  tick game.clock1 unless well into cave (and not at Y2). */
-L2603: if (game.closed) {
+       if (game.closed) {
            if (game.prop[OYSTER] < 0 && TOTING(OYSTER))
                PSPEAK(OYSTER,1);
            for (i=1; i<=NOBJECTS; i++) {
@@ -805,7 +802,7 @@ L2603:      if (game.closed) {
                    game.prop[i] = -1-game.prop[i];
            }
        }
-       game.wzdark=DARK(0);
+       game.wzdark=DARK(game.loc);
        if (game.knfloc > 0 && game.knfloc != game.loc)
            game.knfloc=0;
 
@@ -819,7 +816,7 @@ L2603:      if (game.closed) {
 L2607: game.foobar=(game.foobar>0 ? -game.foobar : 0);
        ++game.turns;
        if (game.turns == game.thresh) {
-       SPEAK(TTEXT[game.trndex]);
+       newspeak(turn_threshold_messages[game.trndex]);
        game.trnluz=game.trnluz+TRNVAL[game.trndex]/100000;
        ++game.trndex;
        game.thresh = -1;
@@ -889,8 +886,7 @@ L2607:      game.foobar=(game.foobar>0 ? -game.foobar : 0);
            game.clock1= -1;
            game.closng=true;
            goto L19999;
-       }
-       if (game.clock1 < 0)
+       } else if (game.clock1 < 0)
            --game.clock2;
        if (game.clock2 == 0) {
            /*  Once he's panicked, and clock2 has run out, we come here
@@ -963,31 +959,39 @@ L2607:    game.foobar=(game.foobar>0 ? -game.foobar : 0);
            game.prop[LAMP]=0;
            if (HERE(LAMP))RSPEAK(184);
        } else if (game.limit <= 30) {
-           if (game.lmwarn || !HERE(LAMP)) goto L19999;
-           game.lmwarn=true;
-           SPK=187;
-           if (game.place[BATTER] == 0)SPK=183;
-           if (game.prop[BATTER] == 1)SPK=189;
-           RSPEAK(SPK);
+           if (!game.lmwarn && HERE(LAMP)) {
+               game.lmwarn=true;
+               int spk=187;
+               if (game.place[BATTER] == 0)spk=183;
+               if (game.prop[BATTER] == 1)spk=189;
+               RSPEAK(spk);
+           }
        }
 L19999: K=43;
        if (LIQLOC(game.loc) == WATER)K=70;
        V1=VOCAB(WD1,-1);
        V2=VOCAB(WD2,-1);
-       if (V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER))
-           goto L2010;
-       if (V1 == ENTER && WD2 > 0)
-           goto L2800;
-       if (!((V1 != 1000+WATER && V1 != 1000+OIL) ||
-             (V2 != 1000+PLANT && V2 != 1000+DOOR))) {
-           if (AT(V2-1000))
-               WD2=MAKEWD(16152118);
+       if (V1 == ENTER && (V2 == STREAM || V2 == 1000+WATER)) {
+           RSPEAK(K);
+           goto L2012;
        }
-       if (V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) && HERE(BIRD))
+       if (V1 == ENTER && WD2 > 0) {
+           WD1=WD2;
+           WD1X=WD2X;
+           WD2=0;
+       } else {
+           if (!((V1 != 1000+WATER && V1 != 1000+OIL) ||
+                 (V2 != 1000+PLANT && V2 != 1000+DOOR))) {
+               if (AT(V2-1000))
+                   WD2=MAKEWD(16152118);
+           }
+           if (V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) && HERE(BIRD))
                WD1=MAKEWD(301200308);
+       }
 L2620: if (WD1 == MAKEWD(23051920)) {
            ++game.iwest;
-           if (game.iwest == 10)RSPEAK(17);
+           if (game.iwest == 10)
+               RSPEAK(17);
        }
        if (WD1 == MAKEWD( 715) && WD2 != 0) {
            if (++IGO == 10)
@@ -995,8 +999,14 @@ L2620:     if (WD1 == MAKEWD(23051920)) {
        }
 L2630:
        i=VOCAB(WD1,-1);
-       if (i == -1)
-          goto L3000;
+       if (i == -1) {
+           /* Gee, I don't understand. */
+           if (fallback_handler(rawbuf))
+               return true;
+           SETPRM(1,WD1,WD1X);
+           RSPEAK(254);
+           goto L2600;
+       }
        K=MOD(i,1000);
        KQ=i/1000+1;
        switch (KQ-1)
@@ -1004,23 +1014,10 @@ L2630:
        case 0: goto L8;
        case 1: goto L5000;
        case 2: goto L4000;
-       case 3: goto L2010;
+       case 3: RSPEAK(K); goto L2012;
        }
        BUG(22);
 
-       /* Get second word for analysis. */
-L2800: WD1=WD2;
-       WD1X=WD2X;
-       WD2=0;
-       goto L2620;
-
-        /* Gee, I don't understand. */
-L3000: SETPRM(1,WD1,WD1X);
-        if (fallback_handler(rawbuf))
-            return true;
-       RSPEAK(254);
-        goto L2600;
-
 /* Verb and object analysis moved to separate module. */
 
 L4000: part=intransitive; VERB=K; goto Laction;
@@ -1031,42 +1028,34 @@ Laction:
           case 2: return true;
           case 8: goto L8;
           case 2000: goto L2000;
-          case 2009: goto L2009;
-          case 2010: goto L2010;
-          case 2011: goto L2011;
           case 2012: goto L2012;
           case 2600: goto L2600;
           case 2607: goto L2607;
           case 2630: goto L2630;
-          case 2800: goto L2800;
-          case 8000: goto L8000;
-          case 18999: goto L18999;
-          case 19000: goto L19000;
+          case 2800:
+             /* Get second word for analysis. */
+              WD1=WD2;
+              WD1X=WD2X;
+              WD2=0;
+              goto L2620;
+          case 8000:
+              /*  Random intransitive verbs come here.  Clear obj just in case
+               *  (see attack()). */
+              SETPRM(1,WD1,WD1X);
+              RSPEAK(257);
+              obj=0;
+              goto L2600;
+          case 19000:
+              /*  Oh dear, he's disturbed the dwarves. */
+              RSPEAK(136);
+              score(0);
+              return true;
           }
        BUG(99);
 
-       /*  Random intransitive verbs come here.  Clear obj just in case
-        *  (see attack()). */
-L8000: SETPRM(1,WD1,WD1X);
-       RSPEAK(257);
-       obj=0;
-       goto L2600;
-
-
        /*  Figure out the new location */
 L8:    if (playermove(cmdin, VERB))
            return true;
        else
            goto L2000;
-
-/*  Cave closing and scoring */
-
-
-
-/*  Oh dear, he's disturbed the dwarves. */
-
-L18999: RSPEAK(SPK);
-L19000: RSPEAK(136);
-       score(0);
-       return true;
 }