#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 */
- long seedval = initialise();
+ int seedval = initialise();
#ifndef ADVENT_NOSAVE
if (!rfp) {
#endif
if (settings.logfp)
- fprintf(settings.logfp, "seed %ld\n", seedval);
+ fprintf(settings.logfp, "seed %d\n", seedval);
/* interpret commands until EOF or interrupt */
for (;;) {
terminate(quitgame);
}
-/* Check if this loc is eligible for any hints. If been here long
+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). */
static void checkhints(void)
if (!CNDBIT(game.loc, hint + 1 + COND_HBASE))
game.hintlc[hint] = -1;
++game.hintlc[hint];
- /* Come here if he's been long enough at required loc(s) for some
+ /* Come here if he's been int enough at required loc(s) for some
* unused hint. */
if (game.hintlc[hint] >= hints[hint].turns) {
int i;
game.hintlc[hint] = 0;
return;
default: // LCOV_EXCL_LINE
+ // Should never hap[pen
BUG(HINT_NUMBER_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
}
for (;;) { /* L12 loop */
for (;;) {
enum condtype_t condtype = travel[travel_entry].condtype;
- long condarg1 = travel[travel_entry].condarg1;
- long condarg2 = travel[travel_entry].condarg2;
+ int condarg1 = travel[travel_entry].condarg1;
+ int condarg2 = travel[travel_entry].condarg2;
if (condtype < cond_not) {
/* YAML N and [pct N] conditionals */
if (condtype == cond_goto || condtype == cond_pct) {
}
}
-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
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
}