static int chain(token_t verb)
/* Do something to the bear's chain */
{
- int spk;
if (verb != LOCK) {
- spk = CHAIN_UNLOCKED;
- if (game.prop[BEAR] == UNTAMED_BEAR)
- spk = BEAR_BLOCKS;
- if (game.prop[CHAIN] == CHAIN_HEAP)
- spk = ALREADY_UNLOCKED;
- if (spk != CHAIN_UNLOCKED) {
- rspeak(spk);
+ if (game.prop[BEAR] == UNTAMED_BEAR) {
+ rspeak(BEAR_BLOCKS);
+ return GO_CLEAROBJ;
+ }
+ if (game.prop[CHAIN] == CHAIN_HEAP) {
+ rspeak(ALREADY_UNLOCKED);
return GO_CLEAROBJ;
}
game.prop[CHAIN] = CHAIN_HEAP;
game.fixed[CHAIN] = CHAIN_HEAP;
if (game.prop[BEAR] != BEAR_DEAD)
game.prop[BEAR] = CONTENTED_BEAR;
- /* FIXME: Arithmetic on state numbers */
- game.fixed[BEAR] = 2 - game.prop[BEAR];
- } else {
- spk = CHAIN_LOCKED;
- if (game.prop[CHAIN] != CHAIN_HEAP)
- spk = ALREADY_LOCKED;
- if (game.loc != objects[CHAIN].plac)
- spk = NO_LOCKSITE;
- if (spk != CHAIN_LOCKED) {
- rspeak(spk);
- return GO_CLEAROBJ;
+
+ switch (game.prop[BEAR]) {
+ case BEAR_DEAD:
+ game.fixed[BEAR] = -1;
+ break;
+ default:
+ game.fixed[BEAR] = 0;
}
- game.prop[CHAIN] = CHAIN_FIXED;
- if (TOTING(CHAIN))
- drop(CHAIN, game.loc);
- game.fixed[CHAIN] = -1;
+ rspeak(CHAIN_UNLOCKED);
+ return GO_CLEAROBJ;
}
- rspeak(spk);
+
+ if (game.prop[CHAIN] != CHAIN_HEAP) {
+ rspeak(ALREADY_LOCKED);
+ return GO_CLEAROBJ;
+ }
+ if (game.loc != objects[CHAIN].plac) {
+ rspeak(NO_LOCKSITE);
+ return GO_CLEAROBJ;
+ }
+
+ game.prop[CHAIN] = CHAIN_FIXED;
+
+ if (TOTING(CHAIN))
+ drop(CHAIN, game.loc);
+ game.fixed[CHAIN] = -1;
+
+ rspeak(CHAIN_LOCKED);
return GO_CLEAROBJ;
}
/* 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 && (LIQUID() != WATER ||
- !HERE(BOTTLE)))
+ if (obj == NO_OBJECT && LIQLOC(game.loc) != WATER &&
+ (LIQUID() != WATER || !HERE(BOTTLE))) {
return GO_UNKNOWN;
- if (obj != BLOOD) {
- if (obj != NO_OBJECT && obj != WATER) {
- rspeak(RIDICULOUS_ATTEMPT);
- } else if (LIQUID() == WATER && HERE(BOTTLE)) {
- game.prop[BOTTLE] = EMPTY_BOTTLE;
- game.place[WATER] = LOC_NOWHERE;
- rspeak(BOTTLE_EMPTY);
- } else {
- rspeak(actions[verb].message);
- }
- } else {
+ }
+
+ if (obj == BLOOD) {
DESTROY(BLOOD);
state_change(DRAGON, DRAGON_BLOODLESS);
game.blooded = true;
+ return GO_CLEAROBJ;
}
+
+ if (obj != NO_OBJECT && obj != WATER) {
+ rspeak(RIDICULOUS_ATTEMPT);
+ return GO_CLEAROBJ;
+ }
+ if (LIQUID() == WATER && HERE(BOTTLE)) {
+ game.prop[BOTTLE] = EMPTY_BOTTLE;
+ game.place[WATER] = LOC_NOWHERE;
+ rspeak(BOTTLE_EMPTY);
+ return GO_CLEAROBJ;
+ }
+
+ rspeak(actions[verb].message);
return GO_CLEAROBJ;
}
obj = LAMP;
if (HERE(URN) && game.prop[URN] == URN_LIT)
obj = URN;
- if (obj == INTRANSITIVE ||
- (HERE(LAMP) && game.prop[LAMP] == LAMP_BRIGHT &&
- HERE(URN) && game.prop[URN] == URN_LIT))
+ if (obj == INTRANSITIVE)
return GO_UNKNOWN;
}
} else {
pspeak(URN, change, URN_DARK, true);
}
+ return GO_CLEAROBJ;
+ }
- } else if (obj == LAMP) {
+ if (obj == LAMP) {
state_change(LAMP, LAMP_DARK);
rspeak(DARK(game.loc) ?
PITCH_DARK :
NO_MESSAGE);
+ return GO_CLEAROBJ;
+ }
- } else if (obj == DRAGON ||
- obj == VOLCANO) {
+ if (obj == DRAGON ||
+ obj == VOLCANO) {
rspeak(BEYOND_POWER);
-
- } else {
- rspeak(actions[verb].message);
+ return GO_CLEAROBJ;
}
+
+ rspeak(actions[verb].message);
return GO_CLEAROBJ;
}
rspeak(NOTHING_HAPPENS);
return GO_CLEAROBJ;
} else {
- /* FIXME: Arithmetic on state numbers */
- pspeak(RESER, look, game.prop[RESER] + 1, true);
- game.prop[RESER] = 1 - game.prop[RESER];
+ state_change(RESER,
+ game.prop[RESER] == WATERS_PARTED ? WATERS_UNPARTED : WATERS_PARTED);
if (AT(RESER))
return GO_CLEAROBJ;
else {
CAGE_FLY :
FREE_FLY);
- /* FIXME: Arithemetic on property values */
- game.prop[FISSURE] = 1 - game.prop[FISSURE];
- pspeak(FISSURE, look, 2 - game.prop[FISSURE], true);
+ state_change(FISSURE,
+ game.prop[FISSURE] == BRIDGED ? UNBRIDGED : BRIDGED);
return GO_CLEAROBJ;
}
}