if (game.fixed[obj] != 0)
return(2011);
if (obj == WATER || obj == OIL) {
- if (!HERE(BOTTLE) || LIQ(0) != obj) {
+ if (!HERE(BOTTLE) || LIQUID() != obj) {
if (TOTING(BOTTLE) && game.prop[BOTTLE] == 1)
return(fill(BOTTLE));
if (game.prop[BOTTLE] != 1)SPK=105;
if ((obj==BIRD || obj==CAGE) && (game.prop[BIRD]==1 || -1-game.prop[BIRD]==1))
CARRY(BIRD+CAGE-obj,game.loc);
CARRY(obj,game.loc);
- if (obj == BOTTLE && LIQ(0) != 0)
- game.place[LIQ(0)] = -1;
+ if (obj == BOTTLE && LIQUID() != 0)
+ game.place[LIQUID()] = -1;
if (!GSTONE(obj) || game.prop[obj] == 0)
return(2009);
game.prop[obj]=0;
if (game.prop[VASE] != 0)game.fixed[VASE]= -1;
}
}
- K=LIQ(0);
+ K=LIQUID();
if (K == obj)obj=BOTTLE;
if (obj == BOTTLE && K != 0)game.place[K]=0;
if (obj == CAGE && game.prop[BIRD] == 1)DROP(BIRD,game.loc);
/* Drink. If no object, assume water and look for it here. If water is in
* the bottle, drink that, else must be at a water loc, so drink stream. */
{
- if (obj == 0 && LIQLOC(game.loc) != WATER && (LIQ(0) != WATER || !HERE(BOTTLE)))
+ if (obj == 0 && LIQLOC(game.loc) != WATER && (LIQUID() != WATER || !HERE(BOTTLE)))
return(8000);
if (obj != BLOOD) {
if (obj != 0 && obj != WATER)SPK=110;
- if (SPK == 110 || LIQ(0) != WATER || !HERE(BOTTLE)) return(2011);
+ if (SPK == 110 || LIQUID() != WATER || !HERE(BOTTLE)) return(2011);
game.prop[BOTTLE]=1;
game.place[WATER]=0;
SPK=74;
if (obj == LAMP) {
game.prop[LAMP]=0;
RSPEAK(40);
- if (DARK(0))
+ if (DARK(game.loc))
RSPEAK(16);
return(2012);
}
SPK=213;
if (game.prop[URN] != 0) return(2011);
SPK=144;
- k=LIQ(0);
+ k=LIQUID();
if (k == 0 || !HERE(BOTTLE)) return(2011);
game.place[k]=0;
game.prop[BOTTLE]=1;
SPK=106;
if (HERE(URN) && game.prop[URN] != 0)
SPK=214;
- if (LIQ(0) != 0)
+ if (LIQUID() != 0)
SPK=105;
if (SPK != 107)
return(2011);
game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2;
- k=LIQ(0);
+ k=LIQUID();
if (TOTING(BOTTLE))
game.place[k]= -1;
if (k == OIL)
/* Find. Might be carrying it, or it might be here. Else give caveat. */
{
if (AT(obj) ||
- (LIQ(0) == obj && AT(BOTTLE)) ||
+ (LIQUID() == obj && AT(BOTTLE)) ||
obj == LIQLOC(game.loc) ||
(obj == DWARF && ATDWRF(game.loc) > 0))
SPK=94;
/* Pour. If no object, or object is bottle, assume contents of bottle.
* special tests for pouring water or oil on plant or rusty door. */
{
- if (obj == BOTTLE || obj == 0)obj=LIQ(0);
+ if (obj == BOTTLE || obj == 0)obj=LIQUID();
if (obj == 0) return(8000);
if (!TOTING(obj)) return(2011);
SPK=78;
if (HERE(i) && OBJTXT[i] != 0 && game.prop[i] >= 0)
obj = obj * NOBJECTS + i;
}
- if (obj > NOBJECTS || obj == 0 || DARK(0)) return(8000);
+ if (obj > NOBJECTS || obj == 0 || DARK(game.loc)) return(8000);
}
- if (DARK(0)) {
+ if (DARK(game.loc)) {
SETPRM(1,WD1,WD1X);
RSPEAK(256);
return(2012);
}
}
-/* 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, enum speechpart part, long verb, long obj)
/* Analyse a verb. Remember what it was, go back for object if second word
* unless verb is "say", which snarfs arbitrary second word.
*/
{
int kk;
+
+ if (part == unknown)
+ {
+ /* 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)" (and no new verb
+ * yet to be analysed). Water and oil are also funny, since
+ * they are never actually dropped at any location, but might
+ * be here inside the bottle or urn or as a feature of the
+ * location. */
+ if (HERE(obj))
+ /* FALL THROUGH */;
+ else 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);
+ }
+ else if (obj == DWARF && ATDWRF(game.loc) > 0)
+ /* FALL THROUGH */;
+ else if ((LIQUID() == obj && HERE(BOTTLE)) || obj == LIQLOC(game.loc))
+ /* FALL THROUGH */;
+ else if (obj == OIL && HERE(URN) && game.prop[URN] != 0) {
+ obj=URN;
+ /* FALL THROUGH */;
+ }
+ else if (obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) {
+ obj=PLANT2;
+ /* FALL THROUGH */;
+ }
+ else if (obj == KNIFE && game.knfloc == game.loc) {
+ game.knfloc= -1;
+ SPK=116;
+ return(2011);
+ }
+ else if (obj == ROD && HERE(ROD2)) {
+ obj=ROD2;
+ /* FALL THROUGH */;
+ }
+ else if ((verb == FIND || verb == INVENT) && WD2 <= 0)
+ /* FALL THROUGH */;
+ else {
+ SETPRM(1,WD1,WD1X);
+ RSPEAK(256);
+ return(2012);
+ }
+
+ if (WD2 > 0)
+ return(2800);
+ if (verb != 0)
+ part = transitive;
+ }
+
switch(part)
{
case intransitive:
}
/* FALLTHRU */
case transitive:
- L4090:
/* Analyse a transitive verb. */
switch (verb-1) {
case 0: /* CARRY */ return carry(obj);
}
BUG(24);
case unknown:
- /* 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)" (and no new verb
- * yet to be analysed). Water and oil are also funny, since
- * they are never actually dropped at any location, but might
- * be here inside the bottle or urn or as a feature of the
- * location. */
- if (!HERE(obj))
- goto L5100;
- L5010:
- if (WD2 > 0)
- return(2800);
- if (verb != 0)
- goto L4090;
+ /* Unknown verb, couldn't deduce object - might need hint */
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) {
- obj=URN;
- goto L5010;
- }
- if (obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) {
- obj=PLANT2;
- goto L5010;
- }
- if (obj == KNIFE && game.knfloc == game.loc) {
- game.knfloc= -1;
- SPK=116;
- return(2011);
- }
- if (obj == ROD && HERE(ROD2)) {
- obj=ROD2;
- goto L5010;
- }
- if ((verb == FIND || verb == INVENT) && WD2 <= 0)
- goto L5010;
-
- SETPRM(1,WD1,WD1X);
- RSPEAK(256);
- return(2012);
- default:
+ default:
BUG(99);
}
}