X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=dca022a5d9657a044e58a2b0b1ad0354ce230d61;hb=865e10e6d0d15df04ac6209990394277ba1da2a7;hp=5bf7d9522a57e8d4c360a12791f3388c2fb0164f;hpb=8c6593ad0c06b58c2343869b7e1394645caa474a;p=open-adventure.git diff --git a/main.c b/main.c index 5bf7d95..dca022a 100644 --- a/main.c +++ b/main.c @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include "advent.h" #include "dungeon.h" @@ -50,11 +52,11 @@ int main(int argc, char *argv[]) #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) { @@ -95,8 +97,13 @@ int main(int argc, char *argv[]) } } + /* 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) { @@ -113,7 +120,7 @@ int main(int argc, char *argv[]) #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 (;;) { @@ -129,7 +136,52 @@ int main(int argc, char *argv[]) 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) @@ -141,7 +193,7 @@ 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; @@ -203,6 +255,7 @@ static void checkhints(void) game.hintlc[hint] = 0; return; default: // LCOV_EXCL_LINE + // Should never hap[pen BUG(HINT_NUMBER_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE } @@ -653,8 +706,8 @@ static void playermove(int motion) 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) { @@ -992,7 +1045,7 @@ static void listobjects(void) } } -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 @@ -1212,8 +1265,9 @@ static bool do_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 }