X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=misc.c;h=6f80c9d861a89bb7c8c73b9ff963ba45b1bea245;hb=eba8015059c1ad2d20e55be9ed69c22aec1871be;hp=ac22ae039dde7a15f739a6d9c67ff9be60eee518;hpb=e66b4561d457352d76582828fbfa3bd83d8b8a4c;p=open-adventure.git diff --git a/misc.c b/misc.c index ac22ae0..6f80c9d 100644 --- a/misc.c +++ b/misc.c @@ -35,7 +35,7 @@ void* xmalloc(size_t size) return (ptr); } -void packed_to_token(long packed, char token[6]) +void packed_to_token(long packed, char token[TOKLEN+1]) { // The advent->ascii mapping. const char advent_to_ascii[] = { @@ -60,14 +60,15 @@ void packed_to_token(long packed, char token[6]) // Replace trailing whitespace with \0. for (int i = 4; i >= 0; --i) { - if (token[i] == ' ' || token[i] == '\t') + if (token[i] == ' ' || + token[i] == '\t') token[i] = '\0'; else break; } } -long token_to_packed(const char token[6]) +long token_to_packed(const char token[TOKLEN+1]) { const char ascii_to_advent[] = { 63, 63, 63, 63, 63, 63, 63, 63, @@ -112,7 +113,7 @@ void tokenize(char* raw, long tokens[4]) int word_count = sscanf(raw, "%s%s", words[0], words[1]); // make space for substrings and zero it out - char chunk_data[][6] = { + char chunk_data[][TOKLEN+1] = { {"\0\0\0\0\0"}, {"\0\0\0\0\0"}, {"\0\0\0\0\0"}, @@ -155,7 +156,7 @@ void wordclear(token_t *v) /* I/O routines (speak, pspeak, rspeak, get_input, yes) */ -void vspeak(const char* msg, va_list ap) +void vspeak(const char* msg, bool blank, va_list ap) { // Do nothing if we got a null pointer. if (msg == NULL) @@ -165,8 +166,7 @@ void vspeak(const char* msg, va_list ap) if (strlen(msg) == 0) return; - // Print a newline if the global game.blklin says to. - if (game.blklin == true) + if (blank == true) printf("\n"); int msglen = strlen(msg); @@ -187,7 +187,7 @@ void vspeak(const char* msg, va_list ap) } else { long arg = va_arg(ap, long); if (arg == -1) - arg = 0; + arg = 0; // LCOV_EXCL_LINE - don't think we can get here. i++; // Integer specifier. In order to accommodate the fact // that PARMS can have both legitimate integers *and* @@ -226,7 +226,8 @@ void vspeak(const char* msg, va_list ap) } // All-lowercase specifier. - if (msg[i] == 'L' || msg[i] == 'C') { + if (msg[i] == 'L' || + msg[i] == 'C') { packed_to_token(arg, renderp); /* unpack directly to destination */ int len = strlen(renderp); for (int j = 0; j < len; ++j) { @@ -253,11 +254,11 @@ void speak(const char* msg, ...) { va_list ap; va_start(ap, msg); - vspeak(msg, ap); + vspeak(msg, true, ap); va_end(ap); } -void pspeak(vocab_t msg, enum speaktype mode, int skip, ...) +void pspeak(vocab_t msg, enum speaktype mode, int skip, bool blank, ...) /* Find the skip+1st message from msg and print it. Modes are: * feel = for inventory, what you can touch * look = the long description for the state the object is in @@ -265,22 +266,22 @@ void pspeak(vocab_t msg, enum speaktype mode, int skip, ...) * study = text on the object. */ { va_list ap; - va_start(ap, skip); + va_start(ap, blank); switch (mode) { case touch: - vspeak(objects[msg].inventory, ap); + vspeak(objects[msg].inventory, blank, ap); break; case look: - vspeak(objects[msg].descriptions[skip], ap); + vspeak(objects[msg].descriptions[skip], blank, ap); break; case hear: - vspeak(objects[msg].sounds[skip], ap); + vspeak(objects[msg].sounds[skip], blank, ap); break; case study: - vspeak(objects[msg].texts[skip], ap); + vspeak(objects[msg].texts[skip], blank, ap); break; case change: - vspeak(objects[msg].changes[skip], ap); + vspeak(objects[msg].changes[skip], blank, ap); break; } va_end(ap); @@ -291,7 +292,7 @@ void rspeak(vocab_t i, ...) { va_list ap; va_start(ap, i); - vspeak(arbitrary_messages[i], ap); + vspeak(arbitrary_messages[i], true, ap); va_end(ap); } @@ -325,12 +326,11 @@ char* get_input() { // Set up the prompt char input_prompt[] = "> "; - if (!prompt) + if (!settings.prompt) input_prompt[0] = '\0'; - // Print a blank line if game.blklin tells us to. - if (game.blklin == true) - printf("\n"); + // Print a blank line + printf("\n"); char* input; while (true) { @@ -353,8 +353,8 @@ char* get_input() if (!isatty(0)) echo_input(stdout, input_prompt, input); - if (logfp) - echo_input(logfp, "", input); + if (settings.logfp) + echo_input(settings.logfp, "", input); return (input); } @@ -389,10 +389,12 @@ bool silent_yes() free(firstword); - if (yes == 0 || y == 0) { + if (yes == 0 || + y == 0) { outcome = true; break; - } else if (no == 0 || n == 0) { + } else if (no == 0 || + n == 0) { outcome = false; break; } else @@ -436,11 +438,13 @@ bool yes(const char* question, const char* yes_response, const char* no_response free(firstword); - if (yes == 0 || y == 0) { + if (yes == 0 || + y == 0) { speak(yes_response); outcome = true; break; - } else if (no == 0 || n == 0) { + } else if (no == 0 || + n == 0) { speak(no_response); outcome = false; break; @@ -459,7 +463,9 @@ int get_motion_vocab_id(const char* word) { for (int i = 0; i < NMOTIONS; ++i) { for (int j = 0; j < motions[i].words.n; ++j) { - if (strcasecmp(word, motions[i].words.strs[j]) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !oldstyle)) + if (strcasecmp(word, motions[i].words.strs[j]) == 0 && (strlen(word) > 1 || + strchr(ignore, word[0]) == NULL || + !settings.oldstyle)) return (i); } } @@ -485,7 +491,9 @@ int get_action_vocab_id(const char* word) { for (int i = 0; i < NACTIONS; ++i) { for (int j = 0; j < actions[i].words.n; ++j) { - if (strcasecmp(word, actions[i].words.strs[j]) == 0 && (strlen(word) > 1 || strchr(ignore, word[0]) == NULL || !oldstyle)) + if (strcasecmp(word, actions[i].words.strs[j]) == 0 && (strlen(word) > 1 || + strchr(ignore, word[0]) == NULL || + !settings.oldstyle)) return (i); } } @@ -633,8 +641,8 @@ long atdwrf(long where) return (at); } -/* Utility routines (SETBIT, TSTBIT, set_seed, get_next_lcg_value, - * randrange, RNDVOC) */ +/* Utility routines (setbit, tstbit, set_seed, get_next_lcg_value, + * randrange) */ long setbit(long bit) /* Returns 2**bit for use in constructing bit-masks. */ @@ -652,6 +660,9 @@ void set_seed(long seedval) /* Set the LCG seed */ { game.lcg_x = (unsigned long) seedval % game.lcg_m; + + // once seed is set, we need to generate the Z`ZZZ word + make_zzword(game.zzword); } unsigned long get_next_lcg_value(void) @@ -668,7 +679,7 @@ long randrange(long range) return range * get_next_lcg_value() / game.lcg_m; } -void make_zzword(char zzword[6]) +void make_zzword(char zzword[TOKLEN+1]) { for (int i = 0; i < 5; ++i) { zzword[i] = 'A' + randrange(26); @@ -677,14 +688,6 @@ void make_zzword(char zzword[6]) zzword[5] = '\0'; } -void datime(long* d, long* t) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - *d = (long) tv.tv_sec; - *t = (long) tv.tv_usec; -} - // LCOV_EXCL_START void bug(enum bugtype num, const char *error_string) {