#include <signal.h>
#include <string.h>
#include <ctype.h>
+#include <unistd.h>
+#include <editline/readline.h>
#include "advent.h"
#include "dungeon.h"
#ifndef ADVENT_NOSAVE
const char* opts = "l:or:";
- const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename]\n";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [script...]\n";
FILE *rfp = NULL;
#else
const char* opts = "l:o";
- const char* usage = "Usage: %s [-l logfilename] [-o]\n";
+ const char* usage = "Usage: %s [-l logfilename] [-o] [script...]\n";
#endif
while ((ch = getopt(argc, argv, opts)) != EOF) {
switch (ch) {
}
}
+ /* copy inncation line part after switches */
+ settings.argc = argc - optind;
+ settings.argv = argv + optind;
+ settings.optind = 0;
+
/* Initialize game variables */
int seedval = initialise();
terminate(quitgame);
}
+char *myreadline(const char *prompt)
+{
+ /*
+ * This function isbn't required for gameplay, readline() straight
+ * up would suffice for tat. It's where we interpret command-line
+ * logfiles for testing purposes.
+ */
+ /* Normal case - no script arguments */
+ if (settings.argc == 0)
+ return readline(prompt);
+
+ char *buf = malloc(BUFSIZ);
+ for (;;) {
+ if (settings.scriptfp == NULL || feof(settings.scriptfp)) {
+ if (settings.optind >= settings.argc) {
+ free(buf);
+ return NULL;
+ }
+
+ char *next = settings.argv[settings.optind++];
+
+ if (settings.scriptfp != NULL && feof(settings.scriptfp))
+ fclose(settings.scriptfp);
+ if (strcmp(next, "-") == 0)
+ settings.scriptfp = stdin; // LCOV_EXCL_LINE
+ else
+ settings.scriptfp = fopen(next, "r");
+ }
+
+ if (isatty(fileno(settings.scriptfp))) {
+ free(buf); // LCOV_EXCL_LINE
+ return readline(prompt); // LCOV_EXCL_LINE
+ } else {
+ char *ln = fgets(buf, BUFSIZ-1, settings.scriptfp);
+ if (ln != NULL) {
+ fputs(PROMPT, stdout);
+ fputs(ln, stdout);
+ return ln;
+ }
+ }
+ }
+
+ return NULL;
+}
+
/* Check if this loc is eligible for any hints. If been here int
* enough, display. Ignore "HINTS" < 4 (special stuff, see database
* notes). */
game.hintlc[hint] = 0;
return;
default: // LCOV_EXCL_LINE
+ // Should never hap[pen
BUG(HINT_NUMBER_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
}
}
}
-bool preprocess_command(command_t *command)
+static bool preprocess_command(command_t *command)
/* Pre-processes a command input to see if we need to tease out a few specific cases:
* - "enter water" or "enter stream":
* wierd specific case that gets the user wet, and then kicks us back to get another command
if (game.loc == LOC_COBBLE ||
game.loc == LOC_DEBRIS ||
game.loc == LOC_AWKWARD ||
- game.loc == LOC_BIRD ||
+ game.loc == LOC_BIRDCHAMBER ||
game.loc == LOC_PITTOP) {
command->word[0].id = ENTRANCE;
}
clear_command(&command);
continue;
}
- break;
+ break;// LCOV_EXCL_LINE
default: // LCOV_EXCL_LINE
+ case NO_WORD_TYPE: // LCOV_EXCL_LINE
BUG(VOCABULARY_TYPE_N_OVER_1000_NOT_BETWEEN_0_AND_3); // LCOV_EXCL_LINE
}