X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=actions.c;h=1031d8ef19ef1915a1ef7b828a17e3e83e35cc61;hb=bea58f268233184eef62a69fb716a519abee43ca;hp=47742e23b43040802a1700caee8ddec32d18bd05;hpb=54d22714d93deb426012dbf693f9061ec13a7339;p=open-adventure.git diff --git a/actions.c b/actions.c index 47742e2..1031d8e 100644 --- a/actions.c +++ b/actions.c @@ -3,6 +3,8 @@ #include "advent.h" #include "database.h" +#define VRSION 25 /* bump on save format change */ + /* * Action handlers. Eventually we'll do lookup through a method table * that calls these. Absolutely nothing like the original FORTRAN. @@ -79,23 +81,24 @@ static int attack(FILE *input, long verb, long obj) * fixed), move rug there (not fixed), and move him there, * too. Then do a null motion to get new description. */ RSPEAK(49); - GETIN(input,WD1,WD1X,WD2,WD2X); - if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) return(2607); + GETIN(input,&WD1,&WD1X,&WD2,&WD2X); + if (WD1 != MAKEWD(25) && WD1 != MAKEWD(250519)) + return(2607); PSPEAK(DRAGON,3); game.prop[DRAGON]=1; game.prop[RUG]=0; - K=(PLAC[DRAGON]+FIXD[DRAGON])/2; + int k=(PLAC[DRAGON]+FIXD[DRAGON])/2; MOVE(DRAGON+NOBJECTS,-1); MOVE(RUG+NOBJECTS,0); - MOVE(DRAGON,K); - MOVE(RUG,K); - DROP(BLOOD,K); + MOVE(DRAGON,k); + MOVE(RUG,k); + DROP(BLOOD,k); for (obj=1; obj<=NOBJECTS; obj++) { - if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON])MOVE(obj,K); - /*etc*/ ; - } /* end loop */ - game.loc=K; - K=NUL; + if (game.place[obj] == PLAC[DRAGON] || game.place[obj] == FIXD[DRAGON]) + MOVE(obj,k); + } + game.loc=k; + K=NUL; /* FIXME: error if removed */ return(8); } @@ -110,7 +113,6 @@ static int bigwords(long foo) if (game.foobar != 0)SPK=151; return(2011); } else { - game.foobar=k; if (k != 4) return(2009); game.foobar=0; @@ -174,7 +176,6 @@ static int vbreak(token_t obj) } } - static int brief(void) /* Brief. Intransitive only. Suppress long descriptions after first time. */ { @@ -525,7 +526,7 @@ static int find(token_t obj) { if (AT(obj) || (LIQ(0) == obj && AT(BOTTLE)) || - K == LIQLOC(game.loc) || + obj == LIQLOC(game.loc) || (obj == DWARF && ATDWRF(game.loc) > 0)) SPK=94; if (game.closed)SPK=138; @@ -779,6 +780,7 @@ static int suspendresume(FILE *input, bool resume) /* Suspend and resume */ { int kk; + long i; if (!resume) { /* Suspend. Offer to save things in a file, but charging * some points (so can't win by using saved games to retry @@ -809,8 +811,8 @@ static int suspendresume(FILE *input, bool resume) * for I/O. All the SAV* functions can be scrapped. */ - DATIME(&I,&K); - K=I+650*K; + DATIME(&i,&K); + K=i+650*K; SAVWRD(kk,K); K=VRSION; SAVWRD(0,K); @@ -891,8 +893,8 @@ static int throw(FILE *cmdin, long verb, long obj) } if (obj != AXE) return(discard(obj, false)); - I=ATDWRF(game.loc); - if (I <= 0) { + int i=ATDWRF(game.loc); + if (i <= 0) { if (AT(DRAGON) && game.prop[DRAGON] == 0) { SPK=152; return throw_support(SPK); @@ -921,8 +923,8 @@ static int throw(FILE *cmdin, long verb, long obj) SPK=48; return throw_support(SPK); } - game.dseen[I]=false; - game.dloc[I]=0; + game.dseen[i]=false; + game.dloc[i]=0; SPK=47; game.dkill=game.dkill+1; if (game.dkill == 1)SPK=149; @@ -970,10 +972,9 @@ static int wave(token_t obj) } } -/* This stuff was broken off as part of an effort to get the main program - * to compile without running out of memory. We're called with a number - * that says what label the caller wanted to "goto", and we return a - * similar label number for the caller to "goto". +/* We're called with a number that says what label the caller wanted + * to "goto", and we return a similar label number for the caller to + * "goto". */ int action(FILE *input, long STARTAT, long verb, long obj) @@ -981,99 +982,99 @@ int action(FILE *input, long STARTAT, long verb, long obj) * unless verb is "say", which snarfs arbitrary second word. */ { - int kk; - switch(STARTAT) { - case 4000: goto L4000; - case 4090: goto L4090; - case 5000: goto L5000; - } - BUG(99); + int kk; + switch(STARTAT) { + case 4000: goto L4000; + case 4090: goto L4090; + case 5000: goto L5000; + } + BUG(99); L4000: - SPK=ACTSPK[verb]; - if (WD2 > 0 && verb != SAY) return(2800); - if (verb == SAY)obj=WD2; - if (obj > 0) goto L4090; + SPK=ACTSPK[verb]; + if (WD2 > 0 && verb != SAY) return(2800); + if (verb == SAY)obj=WD2; + if (obj > 0) goto L4090; /* Analyse an intransitive verb (ie, no object given yet). */ - switch (verb-1) { - case 0: /* CARRY */ return carry(INTRANSITIVE); - case 1: /* DROP */ return(8000); - case 2: /* SAY */ return(8000); - case 3: /* UNLOC */ return lock(verb, INTRANSITIVE); - case 4: /* NOTHI */ return(2009); - case 5: /* LOCK */ return lock(verb, INTRANSITIVE); - case 6: /* LIGHT */ return light(INTRANSITIVE); - case 7: /* EXTIN */ return extinguish(INTRANSITIVE); - case 8: /* WAVE */ return(8000); - case 9: /* CALM */ return(8000); - case 10: /* WALK */ return(2011); - case 11: /* ATTAC */ return attack(input, verb, obj); - case 12: /* POUR */ return pour(obj); - case 13: /* EAT */ return eat(INTRANSITIVE); - case 14: /* DRINK */ return drink(obj); - case 15: /* RUB */ return(8000); - case 16: /* TOSS */ return(8000); - case 17: /* QUIT */ return quit(input); - case 18: /* FIND */ return(8000); - case 19: /* INVEN */ return inven(obj); - case 20: /* FEED */ return(8000); - case 21: /* FILL */ return fill(obj); - case 22: /* BLAST */ return blast(); - case 23: /* SCOR */ return vscore(); - case 24: /* FOO */ return bigwords(WD1); - case 25: /* BRIEF */ return brief(); - case 26: /* READ */ return read(input, INTRANSITIVE); - case 27: /* BREAK */ return(8000); - case 28: /* WAKE */ return(8000); - case 29: /* SUSP */ return suspendresume(input, false); - case 30: /* RESU */ return suspendresume(input, true); - case 31: /* FLY */ return fly(INTRANSITIVE); - case 32: /* LISTE */ return listen(); - case 33: /* ZZZZ */ return reservoir(); - } - BUG(23); + switch (verb-1) { + case 0: /* CARRY */ return carry(INTRANSITIVE); + case 1: /* DROP */ return(8000); + case 2: /* SAY */ return(8000); + case 3: /* UNLOC */ return lock(verb, INTRANSITIVE); + case 4: /* NOTHI */ return(2009); + case 5: /* LOCK */ return lock(verb, INTRANSITIVE); + case 6: /* LIGHT */ return light(INTRANSITIVE); + case 7: /* EXTIN */ return extinguish(INTRANSITIVE); + case 8: /* WAVE */ return(8000); + case 9: /* CALM */ return(8000); + case 10: /* WALK */ return(2011); + case 11: /* ATTAC */ return attack(input, verb, obj); + case 12: /* POUR */ return pour(obj); + case 13: /* EAT */ return eat(INTRANSITIVE); + case 14: /* DRINK */ return drink(obj); + case 15: /* RUB */ return(8000); + case 16: /* TOSS */ return(8000); + case 17: /* QUIT */ return quit(input); + case 18: /* FIND */ return(8000); + case 19: /* INVEN */ return inven(obj); + case 20: /* FEED */ return(8000); + case 21: /* FILL */ return fill(obj); + case 22: /* BLAST */ return blast(); + case 23: /* SCOR */ return vscore(); + case 24: /* FOO */ return bigwords(WD1); + case 25: /* BRIEF */ return brief(); + case 26: /* READ */ return read(input, INTRANSITIVE); + case 27: /* BREAK */ return(8000); + case 28: /* WAKE */ return(8000); + case 29: /* SUSP */ return suspendresume(input, false); + case 30: /* RESU */ return suspendresume(input, true); + case 31: /* FLY */ return fly(INTRANSITIVE); + case 32: /* LISTE */ return listen(); + case 33: /* ZZZZ */ return reservoir(); + } + BUG(23); /* Analyse a transitive verb. */ L4090: switch (verb-1) { - case 0: /* CARRY */ return carry(obj); - case 1: /* DROP */ return discard(obj, false); - case 2: /* SAY */ return say(); - case 3: /* UNLOC */ return lock(verb, obj); - case 4: /* NOTHI */ return(2009); - case 5: /* LOCK */ return lock(verb, obj); - case 6: /* LIGHT */ return light(obj); - case 7: /* EXTI */ return extinguish(obj); - case 8: /* WAVE */ return wave(obj); - case 9: /* CALM */ return(2011); - case 10: /* WALK */ return(2011); - case 11: /* ATTAC */ return attack(input, verb, obj); - case 12: /* POUR */ return pour(obj); - case 13: /* EAT */ return eat(obj); - case 14: /* DRINK */ return drink(obj); - case 15: /* RUB */ return rub(obj); - case 16: /* TOSS */ return throw(input, verb, obj); - case 17: /* QUIT */ return(2011); - case 18: /* FIND */ return find(obj); - case 19: /* INVEN */ return find(obj); - case 20: /* FEED */ return feed(obj); - case 21: /* FILL */ return fill(obj); - case 22: /* BLAST */ return blast(); - case 23: /* SCOR */ return(2011); - case 24: /* FOO */ return(2011); - case 25: /* BRIEF */ return(2011); - case 26: /* READ */ return read(input, obj); - case 27: /* BREAK */ return vbreak(obj); - case 28: /* WAKE */ return wake(obj); - case 29: /* SUSP */ return(2011); - case 30: /* RESU */ return(2011); - case 31: /* FLY */ return fly(obj); - case 32: /* LISTE */ return(2011); - case 33: /* ZZZZ */ return reservoir(); - } - BUG(24); + case 0: /* CARRY */ return carry(obj); + case 1: /* DROP */ return discard(obj, false); + case 2: /* SAY */ return say(); + case 3: /* UNLOC */ return lock(verb, obj); + case 4: /* NOTHI */ return(2009); + case 5: /* LOCK */ return lock(verb, obj); + case 6: /* LIGHT */ return light(obj); + case 7: /* EXTI */ return extinguish(obj); + case 8: /* WAVE */ return wave(obj); + case 9: /* CALM */ return(2011); + case 10: /* WALK */ return(2011); + case 11: /* ATTAC */ return attack(input, verb, obj); + case 12: /* POUR */ return pour(obj); + case 13: /* EAT */ return eat(obj); + case 14: /* DRINK */ return drink(obj); + case 15: /* RUB */ return rub(obj); + case 16: /* TOSS */ return throw(input, verb, obj); + case 17: /* QUIT */ return(2011); + case 18: /* FIND */ return find(obj); + case 19: /* INVEN */ return find(obj); + case 20: /* FEED */ return feed(obj); + case 21: /* FILL */ return fill(obj); + case 22: /* BLAST */ return blast(); + case 23: /* SCOR */ return(2011); + case 24: /* FOO */ return(2011); + case 25: /* BRIEF */ return(2011); + case 26: /* READ */ return read(input, obj); + case 27: /* BREAK */ return vbreak(obj); + case 28: /* WAKE */ return wake(obj); + case 29: /* SUSP */ return(2011); + case 30: /* RESU */ return(2011); + case 31: /* FLY */ return fly(obj); + case 32: /* LISTE */ return(2011); + case 33: /* ZZZZ */ return reservoir(); + } + BUG(24); /* Analyse an object word. See if the thing is here, whether we've got a verb * yet, and so on. Object must be here unless verb is "find" or "invent(ory)" @@ -1081,41 +1082,56 @@ L4090: switch (verb-1) { * they are never actually dropped at any location, but might be here inside * the bottle or urn or as a feature of the location. */ -L5000: obj=K; - if (!HERE(K)) goto L5100; -L5010: if (WD2 > 0) return(2800); - if (verb != 0) goto L4090; - SETPRM(1,WD1,WD1X); - RSPEAK(255); - return(2600); - -L5100: if (K != GRATE) goto L5110; - if (game.loc == 1 || game.loc == 4 || game.loc == 7)K=DPRSSN; - if (game.loc > 9 && game.loc < 15)K=ENTRNC; - if (K != GRATE) return(8); -L5110: if (K == DWARF && ATDWRF(game.loc) > 0) goto L5010; - if ((LIQ(0) == K && HERE(BOTTLE)) || K == LIQLOC(game.loc)) goto L5010; - if (obj != OIL || !HERE(URN) || game.prop[URN] == 0) goto L5120; - obj=URN; - goto L5010; -L5120: if (obj != PLANT || !AT(PLANT2) || game.prop[PLANT2] == 0) goto L5130; - obj=PLANT2; - goto L5010; -L5130: if (obj != KNIFE || game.knfloc != game.loc) goto L5140; - game.knfloc= -1; - SPK=116; - return(2011); -L5140: if (obj != ROD || !HERE(ROD2)) goto L5190; - obj=ROD2; - goto L5010; -L5190: if ((verb == FIND || verb == INVENT) && WD2 <= 0) goto L5010; - SETPRM(1,WD1,WD1X); - RSPEAK(256); - return(2012); - - -/* Statement numbers in this section are 8000 for intransitive verbs, 9000 for - * transitive, plus ten times the verb number. Many intransitive verbs use the - * transitive code, and some verbs use code for other verbs, as noted below. */ +L5000: + if (!HERE(obj)) + goto L5100; +L5010: + if (WD2 > 0) + return(2800); + if (verb != 0) + goto L4090; + SETPRM(1,WD1,WD1X); + RSPEAK(255); + return(2600); + +L5100: + if (obj == GRATE) { + if (game.loc == 1 || game.loc == 4 || game.loc == 7) + obj=DPRSSN; + if (game.loc > 9 && game.loc < 15) + obj=ENTRNC; + if (obj != GRATE) + return(8); + } + if (obj == DWARF && ATDWRF(game.loc) > 0) + goto L5010; + if ((LIQ(0) == obj && HERE(BOTTLE)) || obj == LIQLOC(game.loc)) + goto L5010; + if (obj != OIL || !HERE(URN) || game.prop[URN] == 0) + goto L5120; + obj=URN; + goto L5010; +L5120: + if (obj != PLANT || !AT(PLANT2) || game.prop[PLANT2] == 0) + goto L5130; + obj=PLANT2; + goto L5010; +L5130: + if (obj != KNIFE || game.knfloc != game.loc) + goto L5140; + game.knfloc= -1; + SPK=116; + return(2011); +L5140: + if (obj != ROD || !HERE(ROD2)) + goto L5190; + obj=ROD2; + goto L5010; +L5190: + if ((verb == FIND || verb == INVENT) && WD2 <= 0) + goto L5010; + SETPRM(1,WD1,WD1X); + RSPEAK(256); + return(2012); }