More action handlers. Use consistent VO order.

This commit is contained in:
Eric S. Raymond 2017-06-08 16:18:21 -04:00
parent 1ca74bfc39
commit ee20cd0861
2 changed files with 47 additions and 33 deletions

View file

@ -8,7 +8,25 @@
* that calls these. Absolutely nothing like the original FORTRAN * that calls these. Absolutely nothing like the original FORTRAN
*/ */
static int chain(int verb) static int bivalve(token_t verb, token_t obj)
/* Clam/oyster actions */
{
int k=0;
if(obj == OYSTER)k=1;
SPK=124+k;
if(TOTING(obj))SPK=120+k;
if(!TOTING(TRIDNT))SPK=122+k;
if(verb == LOCK)SPK=61;
if(SPK != 124)
return(2011);
DSTROY(CLAM);
DROP(OYSTER,game.loc);
DROP(PEARL,105);
return(2011);
}
static int chain(token_t verb)
/* Do something to the bear's chain */
{ {
if(verb != LOCK) { if(verb != LOCK) {
SPK=171; SPK=171;
@ -32,6 +50,19 @@ static int chain(int verb)
} }
} }
static int find(token_t obj)
/* Find. Might be carrying it, or it might be here. Else give caveat. */
{
if(AT(obj) ||
(LIQ(0) == obj && AT(BOTTLE)) ||
K == LIQLOC(game.loc) ||
(obj == DWARF && ATDWRF(game.loc) > 0))
SPK=94;
if(game.closed)SPK=138;
if(TOTING(obj))SPK=24;
return(2011);
}
/* This stuff was broken off as part of an effort to get the main program /* 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 * 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 * that says what label the caller wanted to "goto", and we return a
@ -229,30 +260,20 @@ L9040: if(obj == CLAM || obj == OYSTER) goto L9046;
if(obj == GRATE || obj == CHAIN)SPK=31; if(obj == GRATE || obj == CHAIN)SPK=31;
if(SPK != 31 || !HERE(KEYS)) return(2011); if(SPK != 31 || !HERE(KEYS)) return(2011);
if(obj == CHAIN) goto L9048; if(obj == CHAIN) goto L9048;
if(!game.closng) goto L9043; if (game.closng) {
K=130; K=130;
if(!game.panic)game.clock2=15; if(!game.panic)game.clock2=15;
game.panic=true; game.panic=true;
return(2010); return(2010);
}
L9043: K=34+game.prop[GRATE]; K=34+game.prop[GRATE];
game.prop[GRATE]=1; game.prop[GRATE]=1;
if(verb == LOCK)game.prop[GRATE]=0; if(verb == LOCK)game.prop[GRATE]=0;
K=K+2*game.prop[GRATE]; K=K+2*game.prop[GRATE];
return(2010); return(2010);
/* Clam/Oyster. */ /* Clam/Oyster. */
L9046: K=0; L9046: return bivalve(verb, obj);
if(obj == OYSTER)K=1;
SPK=124+K;
if(TOTING(obj))SPK=120+K;
if(!TOTING(TRIDNT))SPK=122+K;
if(verb == LOCK)SPK=61;
if(SPK != 124) return(2011);
DSTROY(CLAM);
DROP(OYSTER,game.loc);
DROP(PEARL,105);
return(2011);
/* Chain. */ /* Chain. */
L9048: return chain(verb); L9048: return chain(verb);
@ -320,7 +341,7 @@ L9094: DROP(JADE,game.loc);
/* Attack also moved into separate module. */ /* Attack also moved into separate module. */
L9120: return(attack(input, obj, verb)); L9120: return(attack(input, verb, obj));
/* Pour. If no object, or object is bottle, assume contents of bottle. /* Pour. If no object, or object is bottle, assume contents of bottle.
* special tests for pouring water or oil on plant or rusty door. */ * special tests for pouring water or oil on plant or rusty door. */
@ -396,24 +417,17 @@ L9160: if(obj != LAMP)SPK=76;
game.tally=game.tally-1; game.tally=game.tally-1;
DROP(CAVITY,game.loc); DROP(CAVITY,game.loc);
SPK=216; SPK=216;
return(2011); return(2011);
/* Throw moved into separate module. */ L9170: return(throw(input, verb, obj));
L9170: return(throw(input, obj, verb));
/* Quit. Intransitive only. Verify intent and exit if that's what he wants. */ /* Quit. Intransitive only. Verify intent and exit if that's what he wants. */
L8180: if(YES(input,22,54,54)) score(1); L8180: if(YES(input,22,54,54)) score(1);
return(2012); return(2012);
/* Find. Might be carrying it, or it might be here. Else give caveat. */
L9190: if(AT(obj) || (LIQ(0) == obj && AT(BOTTLE)) || K == LIQLOC(game.loc) || (obj == L9190: return find(obj);
DWARF && ATDWRF(game.loc) > 0))SPK=94;
if(game.closed)SPK=138;
if(TOTING(obj))SPK=24;
return(2011);
/* Inventory. If object, treat same as find. Else report on current burden. */ /* Inventory. If object, treat same as find. Else report on current burden. */

View file

@ -134,7 +134,7 @@ int discard(long obj, bool just_do_it) {
* objects fall into two categories: enemies (snake, dwarf, etc.) and others * objects fall into two categories: enemies (snake, dwarf, etc.) and others
* (bird, clam, machine). Ambiguous if 2 enemies, or no enemies but 2 others. */ * (bird, clam, machine). Ambiguous if 2 enemies, or no enemies but 2 others. */
int attack(FILE *input, long obj, long verb) { int attack(FILE *input, long verb, long obj) {
int i =ATDWRF(game.loc); int i =ATDWRF(game.loc);
if (obj == 0) { if (obj == 0) {
if (i > 0) if (i > 0)
@ -226,7 +226,7 @@ int throw_support(long spk)
return(8); return(8);
} }
int throw(FILE *cmdin, long obj, long verb) int throw(FILE *cmdin, long verb, long obj)
/* Throw. Same as discard unless axe. Then same as attack except /* Throw. Same as discard unless axe. Then same as attack except
* ignore bird, and if dwarf is present then one might be killed. * ignore bird, and if dwarf is present then one might be killed.
* (Only way to do so!) Axe also special for dragon, bear, and * (Only way to do so!) Axe also special for dragon, bear, and
@ -276,7 +276,7 @@ int throw(FILE *cmdin, long obj, long verb)
JUGGLE(BEAR); JUGGLE(BEAR);
return(2011); return(2011);
} }
return(attack(cmdin, 0, verb)); return(attack(cmdin, verb, 0));
} }
if (randrange(NDWARVES+1) < game.dflag) { if (randrange(NDWARVES+1) < game.dflag) {