return GO_CLEAROBJ;
}
-static int discard(token_t verb, obj_t obj, bool just_do_it)
+static int discard(token_t verb, obj_t obj)
/* Discard object. "Throw" also comes here for most objects. Special cases for
* bird (might attack snake or dragon) and cage (might contain bird) and vase.
* Drop coins at vending machine for extra batteries. */
{
- if (!just_do_it) {
- if (TOTING(ROD2) && obj == ROD && !TOTING(ROD))
- obj = ROD2;
- if (!TOTING(obj)) {
- speak(actions[verb].message);
- return GO_CLEAROBJ;
- }
- if (obj == BIRD && HERE(SNAKE)) {
- rspeak(BIRD_ATTACKS);
- if (game.closed)
- return GO_DWARFWAKE;
- DESTROY(SNAKE);
- /* Set game.prop for use by travel options */
- game.prop[SNAKE] = SNAKE_CHASED;
-
- } else if ((GSTONE(obj) && AT(CAVITY) && game.prop[CAVITY] != CAVITY_FULL)) {
- rspeak(GEM_FITS);
- game.prop[obj] = STATE_IN_CAVITY;
- game.prop[CAVITY] = CAVITY_FULL;
- if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) ||
- (obj == RUBY && game.prop[RUG] == RUG_HOVER))) {
- int spk = RUG_RISES;
- if (TOTING(RUG))
- spk = RUG_WIGGLES;
- if (obj == RUBY)
- spk = RUG_SETTLES;
- rspeak(spk);
- if (spk != RUG_WIGGLES) {
- int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
- game.prop[RUG] = k;
- if (k == RUG_HOVER)
- k = objects[SAPPH].plac;
- move(RUG + NOBJECTS, k);
- }
+ if (TOTING(ROD2) && obj == ROD && !TOTING(ROD))
+ obj = ROD2;
+ if (!TOTING(obj)) {
+ speak(actions[verb].message);
+ return GO_CLEAROBJ;
+ }
+ if (obj == BIRD && HERE(SNAKE)) {
+ rspeak(BIRD_ATTACKS);
+ if (game.closed)
+ return GO_DWARFWAKE;
+ DESTROY(SNAKE);
+ /* Set game.prop for use by travel options */
+ game.prop[SNAKE] = SNAKE_CHASED;
+
+ } else if ((GSTONE(obj) && AT(CAVITY) && game.prop[CAVITY] != CAVITY_FULL)) {
+ rspeak(GEM_FITS);
+ game.prop[obj] = STATE_IN_CAVITY;
+ game.prop[CAVITY] = CAVITY_FULL;
+ if (HERE(RUG) && ((obj == EMERALD && game.prop[RUG] != RUG_HOVER) ||
+ (obj == RUBY && game.prop[RUG] == RUG_HOVER))) {
+ int spk = RUG_RISES;
+ if (TOTING(RUG))
+ spk = RUG_WIGGLES;
+ if (obj == RUBY)
+ spk = RUG_SETTLES;
+ rspeak(spk);
+ if (spk != RUG_WIGGLES) {
+ int k = (game.prop[RUG] == RUG_HOVER) ? RUG_FLOOR : RUG_HOVER;
+ game.prop[RUG] = k;
+ if (k == RUG_HOVER)
+ k = objects[SAPPH].plac;
+ move(RUG + NOBJECTS, k);
}
- } else if (obj == COINS && HERE(VEND)) {
- DESTROY(COINS);
- drop(BATTERY, game.loc);
- pspeak(BATTERY, look, FRESH_BATTERIES, true);
- return GO_CLEAROBJ;
- } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS) {
- rspeak(BIRD_BURNT);
- DESTROY(BIRD);
- return GO_CLEAROBJ;
- } else if (obj == BEAR && AT(TROLL)) {
- state_change(TROLL, TROLL_GONE);
- move(TROLL, LOC_NOWHERE);
- move(TROLL + NOBJECTS, LOC_NOWHERE);
- move(TROLL2, objects[TROLL].plac);
- move(TROLL2 + NOBJECTS, objects[TROLL].fixd);
- juggle(CHASM);
- } else if (obj != VASE ||
- game.loc == objects[PILLOW].plac) {
- rspeak(OK_MAN);
- } else {
- state_change(VASE, AT(PILLOW)
- ? VASE_WHOLE
- : VASE_DROPPED);
- if (game.prop[VASE] != VASE_WHOLE)
- game.fixed[VASE] = IS_FIXED;
}
+ } else if (obj == COINS && HERE(VEND)) {
+ DESTROY(COINS);
+ drop(BATTERY, game.loc);
+ pspeak(BATTERY, look, FRESH_BATTERIES, true);
+ return GO_CLEAROBJ;
+ } else if (obj == BIRD && AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS) {
+ rspeak(BIRD_BURNT);
+ DESTROY(BIRD);
+ return GO_CLEAROBJ;
+ } else if (obj == BEAR && AT(TROLL)) {
+ state_change(TROLL, TROLL_GONE);
+ move(TROLL, LOC_NOWHERE);
+ move(TROLL + NOBJECTS, LOC_NOWHERE);
+ move(TROLL2, objects[TROLL].plac);
+ move(TROLL2 + NOBJECTS, objects[TROLL].fixd);
+ juggle(CHASM);
+ } else if (obj != VASE ||
+ game.loc == objects[PILLOW].plac) {
+ rspeak(OK_MAN);
+ } else {
+ state_change(VASE, AT(PILLOW)
+ ? VASE_WHOLE
+ : VASE_DROPPED);
+ if (game.prop[VASE] != VASE_WHOLE)
+ game.fixed[VASE] = IS_FIXED;
}
int k = LIQUID();
if (k == obj)
/* 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;
}
rspeak(SHATTER_VASE);
game.prop[VASE] = VASE_BROKEN;
game.fixed[VASE] = IS_FIXED;
- return (discard(verb, VASE, true));
+ drop(VASE, game.loc);
+ return GO_CLEAROBJ;
}
if (obj == URN) {
/* 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)
/* Lock, unlock object. Special stuff for opening clam/oyster
* and for chain. */
- if (obj == GRATE ||
- obj == CHAIN) {
+
+ switch (obj) {
+ case CHAIN:
+ if (HERE(KEYS)) {
+ return chain(verb);
+ } else
+ rspeak(NO_KEYS);
+ break;
+ case GRATE:
if (HERE(KEYS)) {
- if (obj == CHAIN)
- return chain(verb);
if (game.closng) {
rspeak(EXIT_CLOSED);
if (!game.panic)
game.clock2 = PANICTIME;
game.panic = true;
- return GO_CLEAROBJ ;
} else {
state_change(GRATE, (verb == LOCK) ?
GRATE_CLOSED :
GRATE_OPEN);
- return GO_CLEAROBJ;
}
- }
- rspeak(NO_KEYS);
- return GO_CLEAROBJ;
- }
-
- switch (obj) {
+ } else
+ rspeak(NO_KEYS);
+ break;
case CLAM:
if (verb == LOCK)
rspeak(HUH_MAN);
drop(PEARL, LOC_CULDESAC);
rspeak(PEARL_FALLS);
}
- return GO_CLEAROBJ;
+ break;
case OYSTER:
if (verb == LOCK)
rspeak(HUH_MAN);
else
rspeak(OYSTER_OPENER);
-
- return GO_CLEAROBJ;
+ break;
case DOOR:
rspeak((game.prop[DOOR] == DOOR_UNRUSTED) ? OK_MAN : RUSTY_DOOR);
break;
return (feed(command->verb, command->obj));
}
if (command->obj != AXE)
- return (discard(command->verb, command->obj, false));
+ return (discard(command->verb, command->obj));
else {
if (atdwrf(game.loc) <= 0) {
if (AT(DRAGON) && game.prop[DRAGON] == DRAGON_BARS)
case CARRY:
return vcarry(command->verb, command->obj);
case DROP:
- return discard(command->verb, command->obj, false);
+ return discard(command->verb, command->obj);
case SAY:
return say(command);
case UNLOCK: