vocab_t verb = command->verb;
obj_t obj = command->obj;
- if (obj == NO_OBJECT ||
- obj == INTRANSITIVE) {
+ if (obj == INTRANSITIVE) {
int changes = 0;
if (atdwrf(game.loc) > 0) {
obj = DWARF;
++changes;
}
/* check for low-priority targets */
- if (obj == NO_OBJECT) {
+ if (obj == INTRANSITIVE) {
/* Can't attack bird or machine by throwing axe. */
if (HERE(BIRD) && verb != THROW) {
obj = BIRD;
state_change(DRAGON, DRAGON_DEAD);
game.prop[RUG] = RUG_FLOOR;
/* Hardcoding LOC_SECRET5 as the dragon's death location is ugly.
- * The way it was computed before was wirse; it depended on the
+ * The way it was computed before was worse; it depended on the
* two dragon locations being LOC_SECRET4 and LOC_SECRET6 and
* LOC_SECRET5 being right between them.
*/
- move(DRAGON + NOBJECTS, -1);
- move(RUG + NOBJECTS, LOC_NOWHERE);
+ move(DRAGON + NOBJECTS, IS_FIXED);
+ move(RUG + NOBJECTS, IS_FREE);
move(DRAGON, LOC_SECRET5);
move(RUG, LOC_SECRET5);
drop(BLOOD, LOC_SECRET5);
}
switch (obj) {
- case NO_OBJECT:
+ case INTRANSITIVE:
rspeak(NO_TARGET);
break;
case CLAM:
static void blast(void)
/* Blast. No effect unless you've got dynamite, which is a neat trick! */
{
- if (game.prop[ROD2] < 0 ||
+ if (game.prop[ROD2] == STATE_NOTFOUND ||
!game.closed)
rspeak(REQUIRES_DYNAMITE);
else {
- game.bonus = VICTORY_MESSAGE;
- if (game.loc == LOC_NE)
- game.bonus = DEFEAT_MESSAGE;
if (HERE(ROD2))
game.bonus = SPLATTER_MESSAGE;
+ else if (game.loc == LOC_NE)
+ game.bonus = DEFEAT_MESSAGE;
+ else
+ game.bonus = VICTORY_MESSAGE;
rspeak(game.bonus);
terminate(endgame);
}
} else if (obj == BEAR && AT(TROLL)) {
state_change(TROLL, TROLL_GONE);
move(TROLL, LOC_NOWHERE);
- move(TROLL + NOBJECTS, LOC_NOWHERE);
+ move(TROLL + NOBJECTS, IS_FREE);
move(TROLL2, objects[TROLL].plac);
move(TROLL2 + NOBJECTS, objects[TROLL].fixd);
juggle(CHASM);
/* 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 == NO_OBJECT && LIQLOC(game.loc) != WATER &&
+ if (obj == INTRANSITIVE && LIQLOC(game.loc) != WATER &&
(LIQUID() != WATER || !HERE(BOTTLE))) {
return GO_UNKNOWN;
}
return GO_CLEAROBJ;
}
- if (obj != NO_OBJECT && obj != WATER) {
+ if (obj != INTRANSITIVE && obj != WATER) {
rspeak(RIDICULOUS_ATTEMPT);
return GO_CLEAROBJ;
}
/* Eat. Intransitive: assume food if present, else ask what. Transitive: food
* ok, some things lose appetite, rest are ridiculous. */
{
- if (obj == INTRANSITIVE) {
+ switch (obj) {
+ case INTRANSITIVE:
if (!HERE(FOOD))
return GO_UNKNOWN;
+ case FOOD:
DESTROY(FOOD);
rspeak(THANKS_DELICIOUS);
- return GO_CLEAROBJ;
- }
- if (obj == FOOD) {
- DESTROY(FOOD);
- rspeak(THANKS_DELICIOUS);
- return GO_CLEAROBJ;
- }
- if (obj == BIRD ||
- obj == SNAKE ||
- obj == CLAM ||
- obj == OYSTER ||
- obj == DWARF ||
- obj == DRAGON ||
- obj == TROLL ||
- obj == BEAR ||
- obj == OGRE) {
+ break;
+ case BIRD:
+ case SNAKE:
+ case CLAM:
+ case OYSTER:
+ case DWARF:
+ case DRAGON:
+ case TROLL:
+ case BEAR:
+ case OGRE:
rspeak(LOST_APPETITE);
- return GO_CLEAROBJ;
+ break;
+ default:
+ speak(actions[verb].message);
}
- speak(actions[verb].message);
return GO_CLEAROBJ;
}
return GO_UNKNOWN;
}
- if (obj == URN) {
+ switch (obj) {
+ case URN:
if (game.prop[URN] != URN_EMPTY) {
state_change(URN, URN_DARK);
} else {
pspeak(URN, change, URN_DARK, true);
}
- return GO_CLEAROBJ;
- }
-
- if (obj == LAMP) {
+ break;
+ case LAMP:
state_change(LAMP, LAMP_DARK);
rspeak(DARK(game.loc) ?
PITCH_DARK :
NO_MESSAGE);
- return GO_CLEAROBJ;
- }
-
- if (obj == DRAGON ||
- obj == VOLCANO) {
+ break;
+ case DRAGON:
+ case VOLCANO:
rspeak(BEYOND_POWER);
- return GO_CLEAROBJ;
+ break;
+ default:
+ speak(actions[verb].message);
}
-
- speak(actions[verb].message);
return GO_CLEAROBJ;
}
game.place[k] = LOC_NOWHERE;
return GO_CLEAROBJ;
}
- if (obj != NO_OBJECT && obj != BOTTLE) {
+ if (obj != INTRANSITIVE && obj != BOTTLE) {
speak(actions[verb].message);
return GO_CLEAROBJ;
}
- if (obj == NO_OBJECT && !HERE(BOTTLE))
+ if (obj == INTRANSITIVE && !HERE(BOTTLE))
return GO_UNKNOWN;
if (HERE(URN) && game.prop[URN] != URN_EMPTY) {
/* Light. Applicable only to lamp and urn. */
{
if (obj == INTRANSITIVE) {
- if (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0)
+ int selects = 0;
+ if (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0) {
obj = LAMP;
- if (HERE(URN) && game.prop[URN] == URN_DARK)
+ selects++;
+ }
+ if (HERE(URN) && game.prop[URN] == URN_DARK) {
obj = URN;
- if (obj == INTRANSITIVE ||
- (HERE(LAMP) && game.prop[LAMP] == LAMP_DARK && game.limit >= 0 &&
- HERE(URN) && game.prop[URN] == URN_DARK))
+ selects++;
+ }
+ if (selects != 1)
return GO_UNKNOWN;
}
- if (obj == URN) {
+ switch (obj) {
+ case URN:
state_change(URN, game.prop[URN] == URN_EMPTY ?
URN_EMPTY :
URN_LIT);
- return GO_CLEAROBJ;
- } else {
- if (obj != LAMP) {
- speak(actions[verb].message);
- return GO_CLEAROBJ;
- }
+ break;
+ case LAMP:
if (game.limit < 0) {
rspeak(LAMP_OUT);
- return GO_CLEAROBJ;
+ break;
}
state_change(LAMP, LAMP_BRIGHT);
if (game.wzdark)
return GO_TOP;
- else
- return GO_CLEAROBJ;
+ break;
+ default:
+ speak(actions[verb].message);
}
+ return GO_CLEAROBJ;
}
static int listen(void)
* special tests for pouring water or oil on plant or rusty door. */
{
if (obj == BOTTLE ||
- obj == NO_OBJECT)
+ obj == INTRANSITIVE)
obj = LIQUID();
if (obj == NO_OBJECT)
return GO_UNKNOWN;
/* Snarf a treasure for the troll. */
drop(command->obj, LOC_NOWHERE);
move(TROLL, LOC_NOWHERE);
- move(TROLL + NOBJECTS, LOC_NOWHERE);
+ move(TROLL + NOBJECTS, IS_FREE);
drop(TROLL2, objects[TROLL].plac);
drop(TROLL2 + NOBJECTS, objects[TROLL].fixd);
juggle(CHASM);
return throw_support(DRAGON_SCALES);
if (AT(TROLL))
return throw_support(TROLL_RETURNS);
- else if (AT(OGRE))
+ if (AT(OGRE))
return throw_support(OGRE_DODGE);
- else if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
+ if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
/* This'll teach him to throw the axe at the bear! */
drop(AXE, game.loc);
game.fixed[AXE] = IS_FIXED;
state_change(AXE, AXE_LOST);
return GO_CLEAROBJ;
}
- command->obj = NO_OBJECT;
+ command->obj = INTRANSITIVE;
return (attack(command));
}
else if ((LIQUID() == command->obj && HERE(BOTTLE)) ||
command->obj == LIQLOC(game.loc))
/* FALL THROUGH */;
- else if (command->obj == OIL && HERE(URN) && game.prop[URN] != 0) {
+ else if (command->obj == OIL && HERE(URN) && game.prop[URN] != URN_EMPTY) {
command->obj = URN;
/* FALL THROUGH */;
- } else if (command->obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != 0) {
+ } else if (command->obj == PLANT && AT(PLANT2) && game.prop[PLANT2] != PLANT_THIRSTY) {
command->obj = PLANT2;
/* FALL THROUGH */;
} else if (command->obj == KNIFE && game.knfloc == game.loc) {
return GO_CLEAROBJ;
}
case ATTACK:
+ command->obj = INTRANSITIVE;
return attack(command);
case POUR:
- return pour(command->verb, command->obj);
+ return pour(command->verb, INTRANSITIVE);
case EAT:
return eat(command->verb, INTRANSITIVE);
case DRINK:
- return drink(command->verb, command->obj);
+ return drink(command->verb, INTRANSITIVE);
case RUB:
return GO_UNKNOWN;
case THROW:
case FEED:
return GO_UNKNOWN;
case FILL:
- return fill(command->verb, command->obj);
+ return fill(command->verb, INTRANSITIVE);
case BLAST:
blast();
return GO_CLEAROBJ;