X-Git-Url: https://jxself.org/git/?p=open-adventure.git;a=blobdiff_plain;f=main.c;h=e16362a0c1b2c767259288744ae4cfe4409d3979;hp=7a179212619ba34b306182894dde4205a0032cb9;hb=e37f858b08e5cf3dfe5a1388e4d89c93527565ee;hpb=a8a7c50691ef3e128e0483665131f9979f6d37f0 diff --git a/main.c b/main.c index 7a17921..e16362a 100644 --- a/main.c +++ b/main.c @@ -41,7 +41,7 @@ long AMBER, AXE, BACK, BATTERY, BEAR, BIRD, BLOOD, RUBY, RUG, SAPPH, SAY, SIGN, SNAKE, STEPS, STREAM, THROW, TRIDENT, TROLL, TROLL2, URN, VASE, VEND, VOLCANO, WATER; -long WD1, WD1X, WD2, WD2X; +token_t WD1, WD1X, WD2, WD2X; FILE *logfp = NULL, *rfp = NULL; bool oldstyle = false; @@ -78,11 +78,11 @@ int main(int argc, char *argv[]) /* Options. */ #ifndef ADVENT_NOSAVE - char* opts = "l:or:s"; - char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n"; + const char* opts = "l:or:s"; + const char* usage = "Usage: %s [-l logfilename] [-o] [-r restorefilename] [-s] \n"; #else - char* opts = "l:os"; - char* usage = "Usage: %s [-l logfilename] [-o] [-s] \n"; + const char* opts = "l:os"; + const char* usage = "Usage: %s [-l logfilename] [-o] [-s] \n"; #endif while ((ch = getopt(argc, argv, opts)) != EOF) { switch (ch) { @@ -115,15 +115,15 @@ int main(int argc, char *argv[]) fprintf(stderr, usage, argv[0]); fprintf(stderr, - " where -l creates a log file of your game named as specified'\n"); + " -l create a log file of your game named as specified'\n"); fprintf(stderr, " -o 'oldstyle' (no prompt, no command editing, displays 'Initialising...')\n"); #ifndef ADVENT_NOSAVE fprintf(stderr, - " -r indicates restoring from specified saved game file\n"); + " -r restore from specified saved game file\n"); #endif fprintf(stderr, - " -s indicates playing with command editing suppressed\n"); + " -s suppress command editing\n"); exit(-1); break; } @@ -131,16 +131,6 @@ int main(int argc, char *argv[]) linenoiseHistorySetMaxLen(350); - /* Logical variables: - * - * game.closed says whether we're all the way closed - * game.closng says whether it's closing time yet - * game.clshnt says whether he's read the clue in the endgame - * game.lmwarn says whether he's been warned about lamp going dim - * game.novice says whether he asked for instructions at start-up - * game.panic says whether he's found out he's trapped in the cave - * game.wzdark says whether the loc he's leaving was dark */ - /* Initialize our LCG PRNG with parameters tested against * Knuth vol. 2. by the original authors */ game.lcg_a = 1093; @@ -157,10 +147,11 @@ int main(int argc, char *argv[]) game.zzword = RNDVOC(3, 0); game.newloc = LOC_START; game.loc = LOC_START; - game.limit = 330; + game.limit = GAMELIMIT; if (!rfp) { game.novice = YES(arbitrary_messages[WELCOME_YOU], arbitrary_messages[CAVE_NEARBY], arbitrary_messages[NO_MESSAGE]); - if (game.novice)game.limit = 1000; + if (game.novice) + game.limit = NOVICELIMIT; } else { restore(rfp); } @@ -193,11 +184,9 @@ static bool fallback_handler(char *buf) return false; } -/* Check if this loc is eligible for any hints. If been here - * long enough, branch to help section (on later page). Hints - * all come back here eventually to finish the loop. Ignore - * "HINTS" < 4 (special stuff, see database notes). - */ +/* Check if this loc is eligible for any hints. If been here long + * enough, display. Ignore "HINTS" < 4 (special stuff, see database + * notes). */ static void checkhints(void) { if (COND[game.loc] >= game.conds) { @@ -295,7 +284,7 @@ static bool spotted_by_pirate(int i) /* The pirate's spotted him. He leaves him alone once we've * found chest. K counts if a treasure is here. If not, and * tally=1 for an unseen chest, let the pirate be spotted. Note - * that game.place[CHEST] = NOWHERE might mean that he's thrown + * that game.place[CHEST] = LOC_NOWHERE might mean that he's thrown * it to the troll, but in that case he's seen the chest * (game.prop=0). */ if (game.loc == game.chloc || game.prop[CHEST] >= 0) @@ -316,7 +305,7 @@ static bool spotted_by_pirate(int i) } } /* Force chest placement before player finds last treasure */ - if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) { + if (game.tally == 1 && snarfed == 0 && game.place[CHEST] == LOC_NOWHERE && HERE(LAMP) && game.prop[LAMP] == 1) { RSPEAK(PIRATE_SPOTTED); movechest = true; } @@ -466,12 +455,15 @@ static bool dwarfmove(void) if (attack == 0) return true; if (game.dflag == 2)game.dflag = 3; - SETPRM(1, attack, 0); - int k = 6; - if (attack > 1)k = THROWN_KNIVES; - RSPEAK(k); - SETPRM(1, stick, 0); - RSPEAK(k + 1 + 2 / (1 + stick)); /* FIXME: Arithmetic on message number */ + if (attack > 1){ + SETPRM(1, attack, 0); + RSPEAK(THROWN_KNIVES); + SETPRM(1, stick, 0); + RSPEAK(stick > 1 ? MULTIPLE_HITS : (stick == 1 ? ONE_HIT : NONE_HIT)); + } else { + RSPEAK(KNIFE_THROWN); + RSPEAK(MISSES_YOU); + } if (stick == 0) return true; game.oldlc2 = game.loc; @@ -512,7 +504,7 @@ static void croak(void) } else if (game.numdie == maximum_deaths || !YES(query, yes_response, arbitrary_messages[OK_MAN])) terminate(endgame); else { - game.place[WATER] = game.place[OIL] = NOWHERE; + game.place[WATER] = game.place[OIL] = LOC_NOWHERE; if (TOTING(LAMP)) game.prop[LAMP] = 0; for (int j = 1; j <= NOBJECTS; j++) { @@ -856,12 +848,11 @@ static void lampcheck(void) --game.limit; /* Another way we can force an end to things is by having the - * lamp give out. When it gets close, we come here to warn - * him. First following ar, if the lamp and fresh batteries are + * lamp give out. When it gets close, we come here to warn him. + * First following arm checks if the lamp and fresh batteries are * here, in which case we replace the batteries and continue. - * Second is for other cases of lamp dying. 12400 is when it - * goes out. Even then, he can explore outside for a while - * if desired. */ + * Second is for other cases of lamp dying. Eve after it goes + * out, he can explore outside for a while if desired. */ if (game.limit <= WARNTIME && HERE(BATTERY) && game.prop[BATTERY] == 0 && HERE(LAMP)) { RSPEAK(REPLACE_BATTERIES); game.prop[BATTERY] = 1; @@ -878,7 +869,7 @@ static void lampcheck(void) if (!game.lmwarn && HERE(LAMP)) { game.lmwarn = true; int spk = GET_BATTERIES; - if (game.place[BATTERY] == NOWHERE)spk = LAMP_DIM; + if (game.place[BATTERY] == LOC_NOWHERE)spk = LAMP_DIM; if (game.prop[BATTERY] == 1)spk = MISSING_BATTERYIES; RSPEAK(spk); } @@ -1066,23 +1057,24 @@ L2607: if (V1 == ENTER && WD2 > 0) { WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); } else { + /* FIXME: Magic numbers */ if (!((V1 != 1000 + WATER && V1 != 1000 + OIL) || (V2 != 1000 + PLANT && V2 != 1000 + DOOR))) { if (AT(V2 - 1000)) - WD2 = MAKEWD(16152118); + WD2 = MAKEWD(WORD_POUR); } if (V1 == 1000 + CAGE && V2 == 1000 + BIRD && HERE(CAGE) && HERE(BIRD)) - WD1 = MAKEWD(301200308); + WD1 = MAKEWD(WORD_CATCH); } L2620: - if (WD1 == MAKEWD(23051920)) { + if (wordeq(WD1, MAKEWD(WORD_WEST))) { ++game.iwest; if (game.iwest == 10) RSPEAK(W_IS_WEST); } - if (WD1 == MAKEWD( 715) && WD2 != 0) { + if (wordeq(WD1, MAKEWD(WORD_GO)) && !wordempty(WD2)) { if (++igo == 10) RSPEAK(GO_UNNEEDED); } @@ -1139,7 +1131,7 @@ Laction: /* Get second word for analysis. */ WD1 = WD2; WD1X = WD2X; - WD2 = 0; + wordclear(&WD2); goto L2620; case GO_UNKNOWN: /* Random intransitive verbs come here. Clear obj just in case