#define DIM(a) (sizeof(a)/sizeof(a[0]))
-FILE *logfp = NULL, *rfp = NULL;
-bool oldstyle = false;
-bool editline = true;
-bool prompt = true;
-
// LCOV_EXCL_START
// exclude from coverage analysis because it requires interactivity to test
static void sig_handler(int signo)
{
if (signo == SIGINT) {
- if (logfp != NULL)
- fflush(logfp);
+ if (settings.logfp != NULL)
+ fflush(settings.logfp);
}
exit(EXIT_FAILURE);
}
* MAIN PROGRAM
*
* Adventure (rev 2: 20 treasures)
-Here's what we think. *
* History: Original idea & 5-treasure version (adventures) by Willie Crowther
* 15-treasure version (adventure) by Don Woods, April-June 1977
* 20-treasure version (rev 2) by Don Woods, August 1978
/* Options. */
#ifndef ADVENT_NOSAVE
- const char* opts = "l:or:s";
- const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n";
+ const char* opts = "l:or:";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename]\n";
+ FILE *rfp = NULL;
#else
- const char* opts = "l:os";
- const char* usage = "Usage: %s [-l logfilename] [-o] [-s] \n";
+ const char* opts = "l:o";
+ const char* usage = "Usage: %s [-l logfilename] [-o]\n";
#endif
while ((ch = getopt(argc, argv, opts)) != EOF) {
switch (ch) {
case 'l':
- logfp = fopen(optarg, "w");
- if (logfp == NULL)
+ settings.logfp = fopen(optarg, "w");
+ if (settings.logfp == NULL)
fprintf(stderr,
"advent: can't open logfile %s for write\n",
optarg);
signal(SIGINT, sig_handler);
break;
case 'o':
- oldstyle = true;
- editline = prompt = false;
+ settings.oldstyle = true;
+ settings.prompt = false;
break;
#ifndef ADVENT_NOSAVE
case 'r':
signal(SIGINT, sig_handler);
break;
#endif
- case 's':
- editline = false;
- break;
default:
fprintf(stderr,
usage, argv[0]);
fprintf(stderr,
" -r restore from specified saved game file\n");
#endif
- fprintf(stderr,
- " -s suppress command editing\n");
exit(EXIT_FAILURE);
break;
}
/* Initialize game variables */
long seedval = initialise();
- /* Start-up, dwarf stuff */
- make_zzword(game.zzword);
-
#ifndef ADVENT_NOSAVE
if (!rfp) {
game.novice = yes(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
}
#endif
- if (logfp)
- fprintf(logfp, "seed %ld\n", seedval);
+ if (settings.logfp)
+ fprintf(settings.logfp, "seed %ld\n", seedval);
/* interpret commands until EOF or interrupt */
for (;;) {
printf("Seed set to %ld\n", sv);
// autogenerated, so don't charge user time for it.
--game.turns;
- // here we reconfigure any global game state that uses random numbers
- make_zzword(game.zzword);
return true;
}
return false;
game.hintlc[hint] = 0;
return;
case 4: /* dark */
- if (game.prop[EMERALD] != -1 && game.prop[PYRAMID] == -1)
+ if (game.prop[EMERALD] != NOT_YET_FOUND && game.prop[PYRAMID] == NOT_YET_FOUND)
break;
game.hintlc[hint] = 0;
return;
kk = tkey[game.dloc[i]];
if (kk != 0)
do {
- game.newloc = T_DESTINATION(travel[kk]);
+ game.newloc = travel[kk].dest;
/* Have we avoided a dwarf encounter? */
- bool avoided = (SPECIAL(game.newloc) ||
- !INDEEP(game.newloc) ||
- game.newloc == game.odloc[i] ||
- (j > 1 && game.newloc == tk[j - 1]) ||
- j >= DIM(tk) - 1 ||
- game.newloc == game.dloc[i] ||
- FORCED(game.newloc) ||
- (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR)) ||
- T_NODWARVES(travel[kk]));
- if (!avoided) {
- tk[j++] = game.newloc;
- }
- ++kk;
+ if (SPECIAL(game.newloc))
+ continue;
+ else if (!INDEEP(game.newloc))
+ continue;
+ else if (game.newloc == game.odloc[i])
+ continue;
+ else if (j > 1 && game.newloc == tk[j - 1])
+ continue;
+ else if (j >= DIM(tk) - 1)
+ continue;
+ else if (game.newloc == game.dloc[i])
+ continue;
+ else if (FORCED(game.newloc))
+ continue;
+ else if (i == PIRATE && CNDBIT(game.newloc, COND_NOARRR))
+ continue;
+ else if (travel[kk].nodwarves)
+ continue;
+ tk[j++] = game.newloc;
} while
- (!travel[kk - 1].stop);
+ (!travel[kk++].stop);
tk[j] = game.odloc[i];
if (j >= 2)
--j;
}
}
+static bool traveleq(long a, long b)
+/* Are two travel entries equal for purposes of skip after failed condition? */
+{
+ return (travel[a].cond == travel[b].cond)
+ && (travel[a].dest == travel[b].dest);
+}
+
/* Given the current location in "game.loc", and a motion verb number in
* "motion", put the new location in "game.newloc". The current loc is saved
* in "game.oldloc" in case he wants to retreat. The current
if (spk == 0) {
int te_tmp = 0;
for (;;) {
- scratchloc = T_DESTINATION(travel[travel_entry]);
+ scratchloc = travel[travel_entry].dest;
if (scratchloc != motion) {
if (!SPECIAL(scratchloc)) {
- if (FORCED(scratchloc) && T_DESTINATION(travel[tkey[scratchloc]]) == motion)
+ if (FORCED(scratchloc) && travel[tkey[scratchloc]].dest == motion)
te_tmp = travel_entry;
}
if (!travel[travel_entry].stop) {
do {
for (;;) { /* L12 loop */
for (;;) {
- long cond = T_CONDITION(travel[travel_entry]);
+ long cond = travel[travel_entry].cond;
long arg = MOD(cond, 100);
if (!SPECIAL(cond)) {
/* YAML N and [pct N] conditionals */
BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
++te_tmp;
} while
- (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+ (traveleq(travel_entry, te_tmp));
travel_entry = te_tmp;
}
/* Found an eligible rule, now execute it */
- game.newloc = T_DESTINATION(travel[travel_entry]);
+ game.newloc = travel[travel_entry].dest;
if (!SPECIAL(game.newloc))
return true;
BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
++te_tmp;
} while
- (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+ (traveleq(travel_entry, te_tmp));
travel_entry = te_tmp;
continue; /* goto L12 */
case 3:
* stuff for bear. */
if (game.prop[TROLL] == TROLL_PAIDONCE) {
pspeak(TROLL, look, TROLL_PAIDONCE);
- game.prop[TROLL] = 0;
+ game.prop[TROLL] = TROLL_UNPAID;
move(TROLL2, 0);
move(TROLL2 + NOBJECTS, 0);
move(TROLL, objects[TROLL].plac);
juggle(CHASM);
if (game.prop[BEAR] != BEAR_DEAD)
DESTROY(BEAR);
- game.prop[CHAIN] = 0;
- game.fixed[CHAIN] = 0;
+ game.prop[CHAIN] = CHAIN_HEAP;
+ game.fixed[CHAIN] = CHAIN_HEAP;
game.prop[AXE] = 0;
game.fixed[AXE] = 0;
rspeak(CAVE_CLOSING);
/* Print out descriptions of objects at this location. If
* not closing and property value is negative, tally off
* another treasure. Rug is special case; once seen, its
- * game.prop is 1 (dragon on it) till dragon is killed.
- * Similarly for chain; game.prop is initially 1 (locked to
+ * game.prop is RUG_DRAGON (dragon on it) till dragon is killed.
+ * Similarly for chain; game.prop is initially CHAINING_BEAR (locked to
* bear). These hacks are because game.prop=0 is needed to
* get full score. */
{
if (game.closed)
continue;
game.prop[obj] = 0;
- if (obj == RUG || obj == CHAIN)
- game.prop[obj] = 1;
+ if (obj == RUG)
+ game.prop[RUG] = RUG_DRAGON;
+ if (obj == CHAIN)
+ game.prop[CHAIN] = CHAINING_BEAR;
--game.tally;
/* Note: There used to be a test here to see whether the
* player had blown it so badly that he could never ever see
command.verb = kmod;
break;
case 3:
- rspeak(specials[kmod].message);
+ speak(specials[kmod].message);
goto L2012;
default:
BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE