#include <stdbool.h>
#include <getopt.h>
#include <signal.h>
-#include <time.h>
#include <string.h>
#include "advent.h"
-#include "linenoise/linenoise.h"
#include "dungeon.h"
#define DIM(a) (sizeof(a)/sizeof(a[0]))
-struct game_t game;
-
FILE *logfp = NULL, *rfp = NULL;
bool oldstyle = false;
-bool editline = true;
bool prompt = true;
// LCOV_EXCL_START
* 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";
#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) {
break;
case 'o':
oldstyle = true;
- editline = prompt = false;
+ 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;
}
}
- linenoiseHistorySetMaxLen(350);
-
- /* Initialize our LCG PRNG with parameters tested against
- * Knuth vol. 2. by the original authors */
- game.lcg_a = 1093;
- game.lcg_c = 221587;
- game.lcg_m = 1048576;
- srand(time(NULL));
- long seedval = (long)rand();
- set_seed(seedval);
-
/* Initialize game variables */
- initialise();
+ long seedval = initialise();
/* Start-up, dwarf stuff */
make_zzword(game.zzword);
- game.newloc = LOC_START;
- game.loc = LOC_START;
- game.limit = GAMELIMIT;
+
+#ifndef ADVENT_NOSAVE
if (!rfp) {
game.novice = yes(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)
} else {
restore(rfp);
}
+#endif
if (logfp)
fprintf(logfp, "seed %ld\n", seedval);
if (PCT(50))
game.dloc[j] = 0;
}
+
+ /* Alternate initial loc for dwarf, in case one of them
+ * starts out on top of the adventurer. */
for (int i = 1; i <= NDWARVES - 1; i++) {
if (game.dloc[i] == game.loc)
- game.dloc[i] = DALTLC;
+ game.dloc[i] = DALTLC; //
game.odloc[i] = game.dloc[i];
}
rspeak(DWARF_RAN);
BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
++te_tmp;
} while
- (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+ ((T_DESTINATION(travel[travel_entry]) == T_DESTINATION(travel[te_tmp])) && (T_CONDITION(travel[travel_entry]) == T_CONDITION(travel[te_tmp])));
travel_entry = te_tmp;
}
BUG(CONDITIONAL_TRAVEL_ENTRY_WITH_NO_ALTERATION); // LCOV_EXCL_LINE
++te_tmp;
} while
- (T_HIGH(travel[travel_entry]) == T_HIGH(travel[te_tmp]));
+ ((T_DESTINATION(travel[travel_entry]) == T_DESTINATION(travel[te_tmp])) && (T_CONDITION(travel[travel_entry]) == T_CONDITION(travel[te_tmp])));
travel_entry = te_tmp;
continue; /* goto L12 */
case 3:
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
}
strncpy(inputbuf, input, LINESIZE - 1);
- linenoiseFree(input);
+ free(input);
long tokens[4];
tokenize(inputbuf, tokens);
wordclear(&command.wd2);
} else {
/* FIXME: Magic numbers related to vocabulary */
- if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) ||
- (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) {
- if (AT(V2 - 1000))
+ if (!((V1 != PROMOTE_WORD(WATER) && V1 != PROMOTE_WORD(OIL)) ||
+ (V2 != PROMOTE_WORD(PLANT) && V2 != PROMOTE_WORD(DOOR)))) {
+ if (AT(DEMOTE_WORD(V2)))
command.wd2 = token_to_packed("POUR");
}
- if (V1 == 1000 + CAGE && V2 == 1000 + BIRD && HERE(CAGE) && HERE(BIRD))
+ if (V1 == PROMOTE_WORD(CAGE) && V2 == PROMOTE_WORD(BIRD) && HERE(CAGE) && HERE(BIRD))
command.wd1 = token_to_packed("CATCH");
}
L2620:
rspeak(DONT_KNOW, command.wd1, command.wd1x);
goto L2600;
}
- /* FIXME: magic numbers related to vocabulary */
+ /* FIXME: magic numbers related to vocabulary */
kmod = MOD(defn, 1000);
switch (defn / 1000) {
case 0: