+ switch (command->part) {
+ case intransitive:
+ if (command->wd2 > 0 && command->verb != SAY)
+ return GO_WORD2;
+ if (command->verb == SAY)
+ command->obj = command->wd2;
+ if (command->obj == 0 || command->obj == INTRANSITIVE) {
+ /* Analyse an intransitive verb (ie, no object given yet). */
+ switch (command->verb) {
+ case CARRY:
+ return vcarry(command->verb, INTRANSITIVE);
+ case DROP:
+ return GO_UNKNOWN;
+ case SAY:
+ return GO_UNKNOWN;
+ case UNLOCK:
+ return lock(command->verb, INTRANSITIVE);
+ case NOTHING: {
+ rspeak(OK_MAN);
+ return (GO_CLEAROBJ);
+ }
+ case LOCK:
+ return lock(command->verb, INTRANSITIVE);
+ case LIGHT:
+ return light(command->verb, INTRANSITIVE);
+ case EXTINGUISH:
+ return extinguish(command->verb, INTRANSITIVE);
+ case WAVE:
+ return GO_UNKNOWN;
+ case TAME:
+ return GO_UNKNOWN;
+ case GO: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case ATTACK:
+ return attack(command);
+ case POUR:
+ return pour(command->verb, command->obj);
+ case EAT:
+ return eat(command->verb, INTRANSITIVE);
+ case DRINK:
+ return drink(command->verb, command->obj);
+ case RUB:
+ return GO_UNKNOWN;
+ case THROW:
+ return GO_UNKNOWN;
+ case QUIT:
+ return quit();
+ case FIND:
+ return GO_UNKNOWN;
+ case INVENTORY:
+ return inven();
+ case FEED:
+ return GO_UNKNOWN;
+ case FILL:
+ return fill(command->verb, command->obj);
+ case BLAST:
+ blast();
+ return GO_CLEAROBJ;
+ case SCORE:
+ score(scoregame);
+ return GO_CLEAROBJ;
+ case GIANTWORDS:
+ return bigwords(command->wd1);
+ case BRIEF:
+ return brief();
+ case READ:
+ command->obj = INTRANSITIVE;
+ return read(*command);
+ case BREAK:
+ return GO_UNKNOWN;
+ case WAKE:
+ return GO_UNKNOWN;
+ case SAVE:
+ return suspend();
+ case RESUME:
+ return resume();
+ case FLY:
+ return fly(command->verb, INTRANSITIVE);
+ case LISTEN:
+ return listen();
+ case PART:
+ return reservoir();
+ default:
+ BUG(INTRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
+ }
+ }
+ /* FALLTHRU */
+ case transitive:
+ /* Analyse a transitive verb. */
+ switch (command->verb) {
+ case CARRY:
+ return vcarry(command->verb, command->obj);
+ case DROP:
+ return discard(command->verb, command->obj, false);
+ case SAY:
+ return say(command);
+ case UNLOCK:
+ return lock(command->verb, command->obj);
+ case NOTHING: {
+ rspeak(OK_MAN);
+ return (GO_CLEAROBJ);
+ }
+ case LOCK:
+ return lock(command->verb, command->obj);
+ case LIGHT:
+ return light(command->verb, command->obj);
+ case EXTINGUISH:
+ return extinguish(command->verb, command->obj);
+ case WAVE:
+ return wave(command->verb, command->obj);
+ case TAME: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case GO: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case ATTACK:
+ return attack(command);
+ case POUR:
+ return pour(command->verb, command->obj);
+ case EAT:
+ return eat(command->verb, command->obj);
+ case DRINK:
+ return drink(command->verb, command->obj);
+ case RUB:
+ return rub(command->verb, command->obj);
+ case THROW:
+ return throw (command);
+ case QUIT: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case FIND:
+ return find(command->verb, command->obj);
+ case INVENTORY:
+ return find(command->verb, command->obj);
+ case FEED:
+ return feed(command->verb, command->obj);
+ case FILL:
+ return fill(command->verb, command->obj);
+ case BLAST:
+ blast();
+ return GO_CLEAROBJ;
+ case SCORE: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case GIANTWORDS: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case BRIEF: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case READ:
+ return read(*command);
+ case BREAK:
+ return vbreak(command->verb, command->obj);
+ case WAKE:
+ return wake(command->verb, command->obj);
+ case SAVE: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case RESUME: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case FLY:
+ return fly(command->verb, command->obj);
+ case LISTEN: {
+ rspeak(spk);
+ return GO_CLEAROBJ;
+ }
+ case PART:
+ return reservoir();
+ default:
+ BUG(TRANSITIVE_ACTION_VERB_EXCEEDS_GOTO_LIST); // LCOV_EXCL_LINE
+ }
+ case unknown:
+ /* Unknown verb, couldn't deduce object - might need hint */
+ rspeak(WHAT_DO, command->wd1, command->wd1x);
+ return GO_CHECKHINT;
+ default:
+ BUG(SPEECHPART_NOT_TRANSITIVE_OR_INTRANSITIVE_OR_UNKNOWN); // LCOV_EXCL_LINE