Remove message pointer math in croak().
[open-adventure.git] / main.c
diff --git a/main.c b/main.c
index a92fa3e2c03759e032257d18cb229aa9f7e3c0c1..7e30f4eb0797a87855fe9caf8ca7f10941afae8d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -30,17 +30,17 @@ struct game_t game;
 long LNLENG, LNPOSN, PARMS[MAXPARMS + 1];
 char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
 
 long LNLENG, LNPOSN, PARMS[MAXPARMS + 1];
 char rawbuf[LINESIZE], INLINE[LINESIZE + 1];
 
-long AMBER, AXE, BACK, BATTER, BEAR, BIRD, BLOOD,
+long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD,
      BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
      CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
      BOTTLE, CAGE, CAVE, CAVITY, CHAIN, CHASM, CHEST,
      CLAM, COINS, DOOR, DPRSSN, DRAGON, DWARF, EGGS,
-     EMRALD, ENTER, ENTRNC, FIND, FISSUR, FOOD,
+     EMERALD, ENTER, ENTRNC, FIND, FISSURE, FOOD,
      GRATE, HINT, INVENT, JADE, KEYS,
      GRATE, HINT, INVENT, JADE, KEYS,
-     KNIFE, LAMP, LOCK, LOOK, MAGZIN,
+     KNIFE, LAMP, LOCK, LOOK, MAGAZINE,
      MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
      MESSAG, MIRROR, NUGGET, NUL, OGRE, OIL, OYSTER,
-     PEARL, PILLOW, PLANT, PLANT2, PYRAM, RESER, ROD, ROD2,
+     PEARL, PILLOW, PLANT, PLANT2, PYRAMID, RESER, ROD, ROD2,
      RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
      RUBY, RUG, SAPPH, SAY, SIGN, SNAKE,
-     STEPS, STREAM, THROW, TRIDNT, TROLL, TROLL2,
-     URN, VASE, VEND, VOLCAN, WATER;
+     STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2,
+     URN, VASE, VEND, VOLCANO, WATER;
 long WD1, WD1X, WD2, WD2X;
 
 FILE  *logfp = NULL, *rfp = NULL;
 long WD1, WD1X, WD2, WD2X;
 
 FILE  *logfp = NULL, *rfp = NULL;
@@ -104,15 +104,15 @@ int main(int argc, char *argv[])
             break;
         default:
             fprintf(stderr,
             break;
         default:
             fprintf(stderr,
-                  "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n", argv[0]);
+                    "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n", argv[0]);
             fprintf(stderr,
             fprintf(stderr,
-                  "  where -l creates a log file of your game named as specified'\n");
+                    "  where -l creates a log file of your game named as specified'\n");
             fprintf(stderr,
             fprintf(stderr,
-                  "        -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n");
+                    "        -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n");
             fprintf(stderr,
             fprintf(stderr,
-                  "        -r indicates restoring from specified saved game file\n");
+                    "        -r indicates restoring from specified saved game file\n");
             fprintf(stderr,
             fprintf(stderr,
-                  "        -s indicates playing with command editing suppressed\n");
+                    "        -s indicates playing with command editing suppressed\n");
             exit(-1);
             break;
         }
             exit(-1);
             break;
         }
@@ -148,7 +148,7 @@ int main(int argc, char *argv[])
     game.loc = LOC_START;
     game.limit = 330;
     if (!rfp) {
     game.loc = LOC_START;
     game.limit = 330;
     if (!rfp) {
-        game.novice = YES(WELCOME_YOU, CAVE_NEARBY, NO_MESSAGE);
+        game.novice = YES(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
         if (game.novice)game.limit = 1000;
     } else {
         restore(rfp);
         if (game.novice)game.limit = 1000;
     } else {
         restore(rfp);
@@ -226,7 +226,7 @@ static void checkhints(void)
                     game.hintlc[hint] = 0;
                     return;
                 case 4:        /* dark */
                     game.hintlc[hint] = 0;
                     return;
                 case 4:        /* dark */
-                    if (game.prop[EMRALD] != -1 && game.prop[PYRAM] == -1)
+                    if (game.prop[EMERALD] != -1 && game.prop[PYRAMID] == -1)
                         break;
                     game.hintlc[hint] = 0;
                     return;
                         break;
                     game.hintlc[hint] = 0;
                     return;
@@ -264,11 +264,11 @@ static void checkhints(void)
 
                 /* Fall through to hint display */
                 game.hintlc[hint] = 0;
 
                 /* Fall through to hint display */
                 game.hintlc[hint] = 0;
-                if (!YES(HINTS[hint][3], NO_MESSAGE, OK_MAN))
+                if (!YES(arbitrary_messages[HINTS[hint][3]], arbitrary_messages[NO_MESSAGE], arbitrary_messages[OK_MAN]))
                     return;
                 SETPRM(1, HINTS[hint][2], HINTS[hint][2]);
                 RSPEAK(HINT_COST);
                     return;
                 SETPRM(1, HINTS[hint][2], HINTS[hint][2]);
                 RSPEAK(HINT_COST);
-                game.hinted[hint] = YES(WANT_HINT, HINTS[hint][4], OK_MAN);
+                game.hinted[hint] = YES(arbitrary_messages[WANT_HINT], arbitrary_messages[HINTS[hint][4]], arbitrary_messages[OK_MAN]);
                 if (game.hinted[hint] && game.limit > WARNTIME)
                     game.limit += WARNTIME * HINTS[hint][2];
             }
                 if (game.hinted[hint] && game.limit > WARNTIME)
                     game.limit += WARNTIME * HINTS[hint][2];
             }
@@ -294,7 +294,7 @@ static bool spotted_by_pirate(int i)
     for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
         /*  Pirate won't take pyramid from plover room or dark
          *  room (too easy!). */
     for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
         /*  Pirate won't take pyramid from plover room or dark
          *  room (too easy!). */
-        if (treasure == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD])) {
+        if (treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD])) {
             continue;
         }
         if (TOTING(treasure) || HERE(treasure))
             continue;
         }
         if (TOTING(treasure) || HERE(treasure))
@@ -326,7 +326,7 @@ static bool spotted_by_pirate(int i)
     if (robplayer) {
         RSPEAK(PIRATE_POUNCES);
         for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
     if (robplayer) {
         RSPEAK(PIRATE_POUNCES);
         for (int treasure = MINTRS; treasure <= MAXTRS; treasure++) {
-            if (!(treasure == PYRAM && (game.loc == PLAC[PYRAM] || game.loc == PLAC[EMRALD]))) {
+            if (!(treasure == PYRAMID && (game.loc == PLAC[PYRAMID] || game.loc == PLAC[EMERALD]))) {
                 if (AT(treasure) && game.fixed[treasure] == 0)
                     CARRY(treasure, game.loc);
                 if (TOTING(treasure))
                 if (AT(treasure) && game.fixed[treasure] == 0)
                     CARRY(treasure, game.loc);
                 if (TOTING(treasure))
@@ -490,6 +490,8 @@ static bool dwarfmove(void)
 static void croak(void)
 /*  Okay, he's dead.  Let's get on with it. */
 {
 static void croak(void)
 /*  Okay, he's dead.  Let's get on with it. */
 {
+    const char* query = obituaries[game.numdie].query;
+    const char* yes_response = obituaries[game.numdie].yes_response;
     ++game.numdie;
     if (game.closng) {
         /*  He died during closing time.  No resurrection.  Tally up a
     ++game.numdie;
     if (game.closng) {
         /*  He died during closing time.  No resurrection.  Tally up a
@@ -497,8 +499,7 @@ static void croak(void)
         RSPEAK(DEATH_CLOSING);
         terminate(endgame);
     }
         RSPEAK(DEATH_CLOSING);
         terminate(endgame);
     }
-    /* FIXME: Arithmetic on message numbers */
-    else if (game.numdie == MAXDIE || !YES(WATCH_IT + game.numdie * 2, WHICH_WAY + game.numdie * 2, OK_MAN))
+    else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN]))
         terminate(endgame);
     else {
         game.place[WATER] = game.place[OIL] = NOWHERE;
         terminate(endgame);
     else {
         game.place[WATER] = game.place[OIL] = NOWHERE;
@@ -636,10 +637,10 @@ static bool playermove(token_t verb, int motion)
                 /* else fall through */
             } else if (game.prop[motion] != game.newloc / 100 - 3)
                 break;
                 /* else fall through */
             } else if (game.prop[motion] != game.newloc / 100 - 3)
                 break;
-       L12:
+L12:
             do {
                 if (TRAVEL[kk] < 0)
             do {
                 if (TRAVEL[kk] < 0)
-                   BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
+                    BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION);
                 ++kk;
                 game.newloc = labs(TRAVEL[kk]) / 1000;
             } while
                 ++kk;
                 game.newloc = labs(TRAVEL[kk]) / 1000;
             } while
@@ -660,18 +661,18 @@ static bool playermove(token_t verb, int motion)
                  *  actual motion, but can be spotted by "go back". */
                 /* FIXME: Arithmetic on location numbers */
                 game.newloc = 99 + 100 - game.loc;
                  *  actual motion, but can be spotted by "go back". */
                 /* FIXME: Arithmetic on location numbers */
                 game.newloc = 99 + 100 - game.loc;
-                if (game.holdng > 1 || (game.holdng == 1 && !TOTING(EMRALD))) {
-                   game.newloc = game.loc;
-                   RSPEAK(MUST_DROP);
-               }
+                if (game.holdng > 1 || (game.holdng == 1 && !TOTING(EMERALD))) {
+                    game.newloc = game.loc;
+                    RSPEAK(MUST_DROP);
+                }
                 return true;
             case 2:
                 /*  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 dropped it, go back and
                  *  pretend he wasn't carrying it after all. */
                 return true;
             case 2:
                 /*  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 dropped it, go back and
                  *  pretend he wasn't carrying it after all. */
-                DROP(EMRALD, game.loc);
-               goto L12;
+                DROP(EMERALD, game.loc);
+                goto L12;
             case 3:
                 /*  Travel 303.  Troll bridge.  Must be done only as special
                  *  motion so that dwarves won't wander across and encounter
             case 3:
                 /*  Travel 303.  Troll bridge.  Must be done only as special
                  *  motion so that dwarves won't wander across and encounter
@@ -707,7 +708,7 @@ static bool playermove(token_t verb, int motion)
             BUG(SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST);
         }
     } while
             BUG(SPECIAL_TRAVEL_500_GT_L_GT_300_EXCEEDS_GOTO_LIST);
         }
     } while
-       (false);
+    (false);
     /* FIXME: Arithmetic on location number, becoming a message number */
     RSPEAK(game.newloc - 500);
     game.newloc = game.loc;
     /* FIXME: Arithmetic on location number, becoming a message number */
     RSPEAK(game.newloc - 500);
     game.newloc = game.loc;
@@ -753,7 +754,7 @@ static bool closecheck(void)
      *  have been activated, since we've found chest. */
     if (game.clock1 == 0) {
         game.prop[GRATE] = 0;
      *  have been activated, since we've found chest. */
     if (game.clock1 == 0) {
         game.prop[GRATE] = 0;
-        game.prop[FISSUR] = 0;
+        game.prop[FISSURE] = 0;
         for (int i = 1; i <= NDWARVES; i++) {
             game.dseen[i] = false;
             game.dloc[i] = 0;
         for (int i = 1; i <= NDWARVES; i++) {
             game.dseen[i] = false;
             game.dloc[i] = 0;
@@ -840,11 +841,11 @@ 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. */
      *  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 <= WARNTIME && HERE(BATTER) && game.prop[BATTER] == 0 && HERE(LAMP)) {
+    if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == 0 && HERE(LAMP)) {
         RSPEAK(REPLACE_BATTERIES);
         RSPEAK(REPLACE_BATTERIES);
-        game.prop[BATTER] = 1;
-        if (TOTING(BATTER))
-            DROP(BATTER, game.loc);
+        game.prop[BATTERY] = 1;
+        if (TOTING(BATTERY))
+            DROP(BATTERY, game.loc);
         game.limit = game.limit + 2500;
         game.lmwarn = false;
     } else if (game.limit == 0) {
         game.limit = game.limit + 2500;
         game.lmwarn = false;
     } else if (game.limit == 0) {
@@ -856,8 +857,8 @@ static void lampcheck(void)
         if (!game.lmwarn && HERE(LAMP)) {
             game.lmwarn = true;
             int spk = GET_BATTERIES;
         if (!game.lmwarn && HERE(LAMP)) {
             game.lmwarn = true;
             int spk = GET_BATTERIES;
-            if (game.place[BATTER] == NOWHERE)spk = LAMP_DIM;
-            if (game.prop[BATTER] == 1)spk = MISSING_BATTERIES;
+            if (game.place[BATTERY] == NOWHERE)spk = LAMP_DIM;
+            if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES;
             RSPEAK(spk);
         }
     }
             RSPEAK(spk);
         }
     }