#include <stdbool.h>
#include <getopt.h>
#include <signal.h>
-#include <time.h>
#include <string.h>
#include "advent.h"
#include "linenoise/linenoise.h"
#define DIM(a) (sizeof(a)/sizeof(a[0]))
-struct game_t game;
-
FILE *logfp = NULL, *rfp = NULL;
bool oldstyle = false;
bool editline = true;
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;
if (!rfp) {
game.novice = yes(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]);
if (game.novice)
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);
/* (ESR) We've found a destination that goes with the motion verb.
* Next we need to check any conditional(s) on this destination, and
* possibly on following entries. */
+ /* FIXME: Magic numbers related to move opcodes */
do {
for (;;) { /* L12 loop */
for (;;) {
* so step out and block him. (standard travel
* entries check for game.prop(TROLL)=0.) Special
* stuff for bear. */
- if (game.prop[TROLL] == 1) {
- pspeak(TROLL, look, 1);
+ if (game.prop[TROLL] == TROLL_PAIDONCE) {
+ pspeak(TROLL, look, TROLL_PAIDONCE);
game.prop[TROLL] = 0;
move(TROLL2, 0);
move(TROLL2 + NOBJECTS, 0);
return true;
} else {
game.newloc = objects[TROLL].plac + objects[TROLL].fixd - game.loc;
- if (game.prop[TROLL] == 0)
- game.prop[TROLL] = 1;
+ if (game.prop[TROLL] == TROLL_UNPAID)
+ game.prop[TROLL] = TROLL_PAIDONCE;
if (!TOTING(BEAR))
return true;
rspeak(BRIDGE_COLLAPSE);
- game.prop[CHASM] = 1;
- game.prop[TROLL] = 2;
+ game.prop[CHASM] = BRIDGE_WRECKED;
+ game.prop[TROLL] = TROLL_GONE;
drop(BEAR, game.newloc);
game.fixed[BEAR] = -1;
game.prop[BEAR] = BEAR_DEAD;
* have been activated, since we've found chest. */
if (game.clock1 == 0) {
game.prop[GRATE] = GRATE_CLOSED;
- game.prop[FISSURE] = 0;
+ game.prop[FISSURE] = UNBRIDGED;
for (int i = 1; i <= NDWARVES; i++) {
game.dseen[i] = false;
game.dloc[i] = 0;
/* This is where we get a new command from the user */
char* input;
+ char inputbuf[LINESIZE];
+
for (;;) {
input = get_input();
if (input == NULL)
if (strcmp(input, "") != 0)
break;
}
+
+ strncpy(inputbuf, input, LINESIZE - 1);
+ linenoiseFree(input);
+
long tokens[4];
- tokenize(input, tokens);
+ tokenize(inputbuf, tokens);
command.wd1 = tokens[0];
command.wd1x = tokens[1];
command.wd2 = tokens[2];
command.wd1x = command.wd2x;
wordclear(&command.wd2);
} else {
- /* FIXME: Magic numbers */
- if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) ||
- (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) {
- if (AT(V2 - 1000))
+ /* FIXME: Magic numbers related to vocabulary */
+ 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:
defn = get_vocab_id(word1);
if (defn == -1) {
/* Gee, I don't understand. */
- if (fallback_handler(input))
+ if (fallback_handler(inputbuf))
continue;
rspeak(DONT_KNOW, command.wd1, command.wd1x);
goto L2600;
}
+ /* FIXME: magic numbers related to vocabulary */
kmod = MOD(defn, 1000);
switch (defn / 1000) {
case 0: