-/* $NetBSD: cypher.c,v 1.15 2000/09/21 17:44:34 jsm Exp $ */
+/* $NetBSD: cypher.c,v 1.21 2000/09/25 19:37:58 jsm Exp $ */
/*
* Copyright (c) 1983, 1993
#if 0
static char sccsid[] = "@(#)cypher.c 8.2 (Berkeley) 4/28/95";
#else
-__RCSID("$NetBSD: cypher.c,v 1.15 2000/09/21 17:44:34 jsm Exp $");
+__RCSID("$NetBSD: cypher.c,v 1.21 2000/09/25 19:37:58 jsm Exp $");
#endif
#endif /* not lint */
char *filename, *rfilename;
size_t filename_len;
- while (wordtype[wordnumber] == ADJS)
- wordnumber++;
while (wordnumber <= wordcount) {
+ if (wordtype[wordnumber] != VERB &&
+ !(wordtype[wordnumber] == OBJECT && wordvalue[wordnumber] == KNIFE)) {
+ printf("%s: How's that?\n",
+ (wordnumber == wordcount) ? words[0] : words[wordnumber]);
+ return (-1);
+ }
+
switch (wordvalue[wordnumber]) {
+ case AUXVERB:
+ /*
+ * Take the following word as the verb (e.g.
+ * "make love", "climb up").
+ */
+ wordnumber++;
+ continue;
+
case UP:
if (location[position].access || wiz || tempwiz) {
if (!location[position].access)
case SHOOT:
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(location[position].objects, n) && objsht[n]) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = shoot();
}
+ if (!things)
+ puts("Nothing to shoot at!");
wordnumber++;
wordnumber++;
} else
case TAKE:
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(location[position].objects, n) && objsht[n]) {
+ things++;
wordvalue[wordnumber + 1] = n;
/* Some objects (type NOUNS)
* have special treatment in
}
wordnumber++;
wordnumber++;
+ if (!things)
+ puts("Nothing to take!");
} else
take(location[position].objects);
break;
case DROP:
-
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(inven, n)) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = drop("Dropped");
}
wordnumber++;
wordnumber++;
+ if (!things)
+ puts("Nothing to drop!");
} else
drop("Dropped");
break;
-
case KICK:
case THROW:
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things, wv;
+ things = 0;
+ wv = wordvalue[wordnumber];
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(inven, n) ||
(testbit(location[position].objects, n) && objsht[n])) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
}
wordnumber += 2;
+ if (!things)
+ printf("Nothing to %s!\n", wv == KICK ? "kick" : "throw");
} else
throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown");
break;
case TAKEOFF:
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(wear, n)) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = takeoff();
}
wordnumber += 2;
+ if (!things)
+ puts("Nothing to take off!");
} else
takeoff();
break;
-
case DRAW:
-
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(wear, n)) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = draw();
}
wordnumber += 2;
+ if (!things)
+ puts("Nothing to draw!");
} else
draw();
break;
-
case PUTON:
-
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(location[position].objects, n) && objsht[n]) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = puton();
}
wordnumber += 2;
+ if (!things)
+ puts("Nothing to put on!");
} else
puton();
break;
case WEARIT:
-
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(inven, n)) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = wearit();
}
wordnumber += 2;
+ if (!things)
+ puts("Nothing to wear!");
} else
wearit();
break;
-
case EAT:
-
if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) {
+ int things;
+ things = 0;
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(inven, n)) {
+ things++;
wordvalue[wordnumber + 1] = n;
wordnumber = eat();
}
wordnumber += 2;
+ if (!things)
+ puts("Nothing to eat!");
} else
eat();
break;
-
case PUT:
put();
break;
-
case INVEN:
if (ucard(inven)) {
puts("You are holding:\n");
for (n = 0; n < NUMOFOBJECTS; n++)
if (testbit(inven, n))
printf("\t%s\n", objsht[n]);
- printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."), (WEIGHT ? carrying * 100 / WEIGHT : -1));
- printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER);
+ if (WEIGHT == 0)
+ printf("\n= %d kilogram%s (can't lift any weight%s)\n",
+ carrying,
+ (carrying == 1 ? "." : "s."),
+ (carrying ? " or move with what you have" : ""));
+ else
+ printf("\n= %d kilogram%s (%d%%)\n",
+ carrying,
+ (carrying == 1 ? "." : "s."),
+ carrying * 100 / WEIGHT);
+ if (CUMBER == 0)
+ printf("Your arms can't pick anything up.\n");
+ else
+ printf("Your arms are %d%% full.\n",
+ encumber * 100 / CUMBER);
} else
puts("You aren't carrying anything.");
return (-1);
break;
-
}
if (wordnumber < wordcount && *words[wordnumber++] == ',')
continue;