}
}
+static token_t birdspeak(void)
+{
+ switch (game.prop[BIRD]) {
+ case BIRD_UNCAGED:
+ case BIRD_FOREST_UNCAGED:
+ return FREE_FLY;
+ case BIRD_CAGED:
+ return CAGE_FLY;
+ }
+}
+
static int wave(token_t verb, token_t obj)
/* Wave. No effect unless waving rod at fissure or at bird. */
{
rspeak(spk);
return GO_CLEAROBJ;
}
- /* FIXME: Arithemetic on property values */
+
if (HERE(BIRD))
- spk = FREE_FLY + MOD(game.prop[BIRD], 2);
+ spk = birdspeak();
if (spk == FREE_FLY && game.loc == game.place[STEPS] && game.prop[JADE] < 0) {
drop(JADE, game.loc);
game.prop[JADE] = 0;
}
if (HERE(BIRD))
rspeak(spk);
+
+ /* FIXME: Arithemetic on property values */
game.prop[FISSURE] = 1 - game.prop[FISSURE];
pspeak(FISSURE, look, 2 - game.prop[FISSURE], true);
return GO_CLEAROBJ;
}
}
+
+
int action(struct command_t *command)
/* Analyse a verb. Remember what it was, go back for object if second word
* unless verb is "say", which snarfs arbitrary second word.
*/
{
- token_t spk = actions[command->verb].message;
-
if (command->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
/* FALL THROUGH */;
} else if (command->obj == KNIFE && game.knfloc == game.loc) {
game.knfloc = -1;
- spk = KNIVES_VANISH;
- rspeak(spk);
+ rspeak(KNIVES_VANISH);
return GO_CLEAROBJ;
} else if (command->obj == ROD && HERE(ROD2)) {
command->obj = ROD2;
case TAME:
return GO_UNKNOWN;
case GO: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case ATTACK:
case WAVE:
return wave(command->verb, command->obj);
case TAME: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case GO: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case ATTACK:
case THROW:
return throw (command);
case QUIT: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case FIND:
blast();
return GO_CLEAROBJ;
case SCORE: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case GIANTWORDS: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case BRIEF: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case READ:
case WAKE:
return wake(command->verb, command->obj);
case SAVE: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case RESUME: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case FLY:
return fly(command->verb, command->obj);
case LISTEN: {
- rspeak(spk);
+ rspeak(actions[command->verb].message);
return GO_CLEAROBJ;
}
case PART: