X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=main.c;h=dd29c92deac960141c75ba240d82fb7aebb52750;hb=0e160a665eeb24d4614ff14e779d1c13bec3e778;hp=993cd523d11ea12f30335dc84bff577acd27ffd7;hpb=058e566e60276e8035a128f3c621fc995439cb61;p=open-adventure.git diff --git a/main.c b/main.c index 993cd52..dd29c92 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,16 @@ /* + * There used to be a note that said this: + * * The author - Don Woods - apologises for the style of the code; it * is a result of running the original Fortran IV source through a * home-brew Fortran-to-C converter.) + * + * Now that the code has been restructured into idiomatic C, the following + * is more appropriate: + * + * ESR apologizes for the remaing gotos (now confined to two functions in this + * file - they used to be *everywhere*), and the offensive globals. Applying + * the Structured Program Theorem can be hard. */ #include #include @@ -11,6 +20,7 @@ #include #include "advent.h" #include "database.h" +#include "linenoise/linenoise.h" struct game_t game; @@ -82,6 +92,8 @@ case 'l': } } + linenoiseHistorySetMaxLen(350); + /* Logical variables: * * game.closed says whether we're all the way closed @@ -473,7 +485,7 @@ static void croak(FILE *cmdin) * "K", put the new location in "game.newloc". The current loc is saved * in "game.oldloc" in case he wants to retreat. The current * game.oldloc is saved in game.oldlc2, in case he dies. (if he - * does, game.newloc will be limbo, and OLgame.dloc will be what killed + * does, game.newloc will be limbo, and game.oldloc will be what killed * him, so we need game.oldlc2, which is the last place he was * safe.) */ @@ -485,7 +497,7 @@ static bool playermove(FILE *cmdin, token_t verb) BUG(26); if (K == NUL) return true; - if (K == BACK) { + else if (K == BACK) { /* Handle "go back". Look for verb which goes from game.loc to * game.oldloc, or to game.oldlc2 If game.oldloc has forced-motion. * K2 saves entry -> forced loc -> previous loc. */ @@ -506,7 +518,7 @@ static bool playermove(FILE *cmdin, token_t verb) K2=KK; } if (TRAVEL[KK] >= 0) { - KK=KK+1; + ++KK; goto L21; } KK=K2; @@ -519,21 +531,22 @@ static bool playermove(FILE *cmdin, token_t verb) K=MOD(labs(TRAVEL[KK]),1000); KK=KEY[game.loc]; goto L9; + } else { + RSPEAK(K2); + return true; } - RSPEAK(K2); - return true; } - if (K == LOOK) { + else if (K == LOOK) { /* Look. Can't give more detail. Pretend it wasn't dark * (though it may "now" be dark) so he won't fall into a * pit while staring into the gloom. */ if (game.detail < 3)RSPEAK(15); - game.detail=game.detail+1; + ++game.detail; game.wzdark=false; game.abbrev[game.loc]=0; return true; } - if (K == CAVE) { + else if (K == CAVE) { /* Cave. Different messages depending on whether above ground. */ RSPEAK((OUTSID(game.loc) && game.loc != 8) ? 57 : 58); return true; @@ -560,7 +573,7 @@ L9: RSPEAK(SPK); return true; } - KK=KK+1; + ++KK; } LL=LL/1000; @@ -579,7 +592,7 @@ L11: L12: do { if (TRAVEL[KK] < 0)BUG(25); - KK=KK+1; + ++KK; game.newloc=labs(TRAVEL[KK])/1000; } while (game.newloc == LL); @@ -659,6 +672,7 @@ static bool do_command(FILE *cmdin) long KQ, VERB, KK, V1, V2; long obj, i; static long IGO = 0; + enum speechpart part; /* Can't leave cave once it's closing (except by main office). */ if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) { @@ -722,7 +736,7 @@ L2000: if (game.loc == 0) * get full score. */ if (DARK(0)) goto L2012; - game.abbrev[game.loc]=game.abbrev[game.loc]+1; + ++game.abbrev[game.loc]; i=game.atloc[game.loc]; L2004: if (i == 0) goto L2012; obj=i; @@ -732,7 +746,7 @@ L2004: if (i == 0) goto L2012; if (game.closed) goto L2008; game.prop[obj]=0; if (obj == RUG || obj == CHAIN)game.prop[obj]=1; - game.tally=game.tally-1; + --game.tally; /* Note: There used to be a test here to see whether the player had blown it * so badly that he could never ever see the remaining treasures, and if so * the lamp was zapped to 35 turns. But the tests were too simple-minded; @@ -768,7 +782,7 @@ L2600: if (COND[game.loc] >= game.conds) { continue; if (!CNDBIT(game.loc,hint+10)) game.hintlc[hint]= -1; - game.hintlc[hint] = game.hintlc[hint]+1; + ++game.hintlc[hint]; if (game.hintlc[hint] >= HINTS[hint][1]) dohint(cmdin, hint); } @@ -799,22 +813,25 @@ L2603: if (game.closed) { * going on. If pos, make neg. If neg, he skipped a word, * so make it zero. */ L2607: game.foobar=(game.foobar>0 ? -game.foobar : 0); - game.turns=game.turns+1; + ++game.turns; if (game.turns == game.thresh) { SPEAK(TTEXT[game.trndex]); game.trnluz=game.trnluz+TRNVAL[game.trndex]/100000; - game.trndex=game.trndex+1; - game.thresh= -1; + ++game.trndex; + game.thresh = -1; if (game.trndex <= TRNVLS) game.thresh=MOD(TRNVAL[game.trndex],100000)+1; } if (VERB == SAY && WD2 > 0)VERB=0; if (VERB == SAY) goto L4090; - if (game.tally == 0 && INDEEP(game.loc) && game.loc != 33)game.clock1=game.clock1-1; + if (game.tally == 0 && INDEEP(game.loc) && game.loc != 33) + --game.clock1; if (game.clock1 == 0) goto L10000; - if (game.clock1 < 0)game.clock2=game.clock2-1; + if (game.clock1 < 0) + --game.clock2; if (game.clock2 == 0) goto L11000; - if (game.prop[LAMP] == 1)game.limit=game.limit-1; + if (game.prop[LAMP] == 1) + --game.limit; if (game.limit <= 30 && HERE(BATTER) && game.prop[BATTER] == 0 && HERE(LAMP)) goto L12000; if (game.limit == 0) goto L12400; @@ -831,8 +848,8 @@ L19999: K=43; L2610: if (V1 == 1000+CAGE && V2 == 1000+BIRD && HERE(CAGE) && HERE(BIRD)) WD1=MAKEWD(301200308); L2620: if (WD1 == MAKEWD(23051920)) { - game.iwest=game.iwest+1; - if (game.iwest == 10)RSPEAK(17); + ++game.iwest; + if (game.iwest == 10)RSPEAK(17); } if (WD1 == MAKEWD( 715) && WD2 != 0) { if (++IGO == 10) @@ -844,19 +861,22 @@ L2630: goto L3000; K=MOD(i,1000); KQ=i/1000+1; - switch (KQ-1) { case 0: goto L8; case 1: goto L5000; case 2: goto L4000; - case 3: goto L2010; } + switch (KQ-1) + { + case 0: goto L8; + case 1: goto L5000; + case 2: goto L4000; + case 3: goto L2010; + } BUG(22); -/* Get second word for analysis. */ - + /* Get second word for analysis. */ L2800: WD1=WD2; WD1X=WD2X; WD2=0; - goto L2620; - -/* Gee, I don't understand. */ + goto L2620; + /* Gee, I don't understand. */ L3000: SETPRM(1,WD1,WD1X); if (fallback_handler(rawbuf)) return true; @@ -865,11 +885,11 @@ L3000: SETPRM(1,WD1,WD1X); /* Verb and object analysis moved to separate module. */ -L4000: i=4000; VERB=K; goto Laction; -L4090: i=4090; goto Laction; -L5000: i=5000; obj = K; +L4000: part=intransitive; VERB=K; goto Laction; +L4090: part=transitive; goto Laction; +L5000: part=unknown; obj = K; Laction: - switch (action(cmdin, i, VERB, obj)) { + switch (action(cmdin, part, VERB, obj)) { case 2: return true; case 8: goto L8; case 2000: goto L2000; @@ -887,18 +907,16 @@ Laction: } BUG(99); -/* Random intransitive verbs come here. Clear obj just in case (see "attack"). - */ - + /* Random intransitive verbs come here. Clear obj just in case + * (see attack()). */ L8000: SETPRM(1,WD1,WD1X); RSPEAK(257); obj=0; goto L2600; -/* Figure out the new location */ -L8: - if (playermove(cmdin, VERB)) + /* Figure out the new location */ +L8: if (playermove(cmdin, VERB)) return true; else goto L2000; @@ -982,7 +1000,7 @@ L11000: game.prop[BOTTLE]=PUT(BOTTLE,115,1); PUT(GRATE,116,0); PUT(SIGN,116,0); - OBJTXT[SIGN]=OBJTXT[SIGN]+1; + ++OBJTXT[SIGN]; game.prop[SNAKE]=PUT(SNAKE,116,1); game.prop[BIRD]=PUT(BIRD,116,1); game.prop[CAGE]=PUT(CAGE,116,0);