]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - battlestar/com2.c
Use a lookup table to identify whether objects are plural or singular,
[bsdgames-darwin.git] / battlestar / com2.c
index a38afe4c9e2490f3076739697312048047766518..07634da4b6bace12a5c5135fb10334c4854b13f7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: com2.c,v 1.4 1997/01/07 11:56:35 tls Exp $     */
+/*     $NetBSD: com2.c,v 1.15 2000/09/23 19:23:57 jsm Exp $    */
 
 /*
  * Copyright (c) 1983, 1993
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)com2.c     8.2 (Berkeley) 4/28/95";
 #else
-static char rcsid[] = "$NetBSD: com2.c,v 1.4 1997/01/07 11:56:35 tls Exp $";
+__RCSID("$NetBSD: com2.c,v 1.15 2000/09/23 19:23:57 jsm Exp $");
 #endif
-#endif /* not lint */
+#endif                         /* not lint */
 
 #include "extern.h"
 
-wearit()               /* synonyms = {sheathe, sheath} */
-{
-       register int n;
-       int firstnumber, value;
+int
+wearit()
+{                              /* synonyms = {sheathe, sheath} */
+       int     firstnumber, value;
 
        firstnumber = wordnumber;
-       while(wordtype[++wordnumber] == ADJS);
-       while(wordnumber <= wordcount){
+       wordnumber++;
+       while (wordnumber <= wordcount && (wordtype[wordnumber] == OBJECT ||
+           wordtype[wordnumber] == NOUNS) && wordvalue[wordnumber] != DOOR) {
                value = wordvalue[wordnumber];
-               for (n=0; objsht[value][n]; n++);
-               switch(value){
-                       
-                       case -1:
-                               puts("Wear what?");
-                               return(firstnumber);
+               if (objsht[value] == NULL)
+                       break;
+               switch (value) {
 
-                       default:
-                               printf("You can't wear%s%s!\n",(objsht[value][n-1] == 's' ? " " : " a "),objsht[value]);
-                               return(firstnumber);
+               case -1:
+                       puts("Wear what?");
+                       return (firstnumber);
 
-                       case KNIFE:
-               /*      case SHIRT:     */
-                       case ROBE:
-                       case LEVIS:     /* wearable things */
-                       case SWORD:
-                       case MAIL:
-                       case HELM:
-                       case SHOES:
-                       case PAJAMAS:
-                       case COMPASS:
-                       case LASER:
-                       case AMULET:
-                       case TALISMAN:
-                       case MEDALION:
-                       case ROPE:
-                       case RING:
-                       case BRACELET:
-                       case GRENADE:
+               default:
+                       printf("You can't wear%s%s!\n", (is_plural_object(value) ? " " : " a "), objsht[value]);
+                       return (firstnumber);
 
-                               if (testbit(inven,value)){
-                                       clearbit(inven,value);
-                                       setbit(wear,value);
-                                       carrying -= objwt[value];
-                                       encumber -= objcumber[value];
-                                       time++;
-                                       printf("You are now wearing %s %s.\n",(objsht[value][n-1] == 's' ? "the" : "a"), objsht[value]);
-                               }
-                               else if (testbit(wear,value))
-                                       printf("You are already wearing the %s.\n", objsht[value]);
-                               else 
-                                       printf("You aren't holding the %s.\n", objsht[value]);
-                               if (wordnumber < wordcount - 1 && wordvalue[++wordnumber] == AND)
-                                       wordnumber++;
-                               else 
-                                       return(firstnumber);
-               } /* end switch */
-       } /* end while */
+               case KNIFE:
+                       /* case SHIRT:   */
+               case ROBE:
+               case LEVIS:     /* wearable things */
+               case SWORD:
+               case MAIL:
+               case HELM:
+               case SHOES:
+               case PAJAMAS:
+               case COMPASS:
+               case LASER:
+               case AMULET:
+               case TALISMAN:
+               case MEDALION:
+               case ROPE:
+               case RING:
+               case BRACELET:
+               case GRENADE:
+
+                       if (testbit(inven, value)) {
+                               clearbit(inven, value);
+                               setbit(wear, value);
+                               carrying -= objwt[value];
+                               encumber -= objcumber[value];
+                               ourtime++;
+                               printf("You are now wearing %s %s.\n",
+                                   (is_plural_object(value) ? "the"
+                                       : "a"), objsht[value]);
+                       } else
+                               if (testbit(wear, value))
+                                       printf("You are already wearing the %s.\n",
+                                           objsht[value]);
+                               else
+                                       printf("You aren't holding the %s.\n",
+                                           objsht[value]);
+                       if (wordnumber < wordcount - 1 &&
+                           wordvalue[++wordnumber] == AND)
+                               wordnumber++;
+                       else
+                               return (firstnumber);
+               }               /* end switch */
+       }                       /* end while */
        puts("Don't be ridiculous.");
-       return(firstnumber);
+       return (firstnumber);
 }
 
-put()          /* synonyms = {buckle, strap, tie} */
-{
-       if (wordvalue[wordnumber + 1] == ON){
+int
+put()
+{                              /* synonyms = {buckle, strap, tie} */
+       if (wordvalue[wordnumber + 1] == ON) {
                wordvalue[++wordnumber] = PUTON;
-               return(cypher());
+               return (cypher());
        }
-       if (wordvalue[wordnumber + 1] == DOWN){
+       if (wordvalue[wordnumber + 1] == DOWN) {
                wordvalue[++wordnumber] = DROP;
-               return(cypher());
+               return (cypher());
        }
        puts("I don't understand what you want to put.");
-       return(-1);
+       return (-1);
 
 }
 
-draw()                         /* synonyms = {pull, carry} */
-{
-       return(take(wear));
+int
+draw()
+{                              /* synonyms = {pull, carry} */
+       return (take(wear));
 }
 
+int
 use()
 {
-       while (wordtype[++wordnumber] == ADJS && wordnumber < wordcount);
-       if (wordvalue[wordnumber] == AMULET && testbit(inven,AMULET) && position != FINAL){
+       wordnumber++;
+       if (wordvalue[wordnumber] == AMULET && testbit(inven, AMULET) &&
+           position != FINAL) {
                puts("The amulet begins to glow.");
-               if (testbit(inven,MEDALION)){
+               if (testbit(inven, MEDALION)) {
                        puts("The medallion comes to life too.");
-                       if (position == 114){
+                       if (position == 114) {
                                location[position].down = 160;
                                whichway(location[position]);
                                puts("The waves subside and it is possible to descend to the sea cave now.");
-                               time++;
-                               return(-1);
+                               ourtime++;
+                               return (-1);
                        }
                }
                puts("A light mist falls over your eyes and the sound of purling water trickles in");
@@ -145,158 +157,189 @@ use()
                        position = 224;
                else
                        position = 229;
-               time++;
-               return(0);
-       }
-       else if (position == FINAL)
+               ourtime++;
+               notes[CANTSEE] = 0;
+               return (0);
+       else if (position == FINAL)
                puts("The amulet won't work in here.");
-       else if (wordvalue[wordnumber] == COMPASS && testbit(inven,COMPASS))
-               printf("Your compass points %s.\n",truedirec(NORTH,'-'));
+       else if (wordvalue[wordnumber] == COMPASS && testbit(inven, COMPASS))
+               printf("Your compass points %s.\n", truedirec(NORTH, '-'));
        else if (wordvalue[wordnumber] == COMPASS)
                puts("You aren't holding the compass.");
        else if (wordvalue[wordnumber] == AMULET)
                puts("You aren't holding the amulet.");
        else
                puts("There is no apparent use.");
-       return(-1);
+       return (-1);
 }
 
+void
 murder()
 {
-       register int n;
+       int     n;
 
-       for (n=0; !((n == SWORD || n == KNIFE || n == TWO_HANDED || n == MACE || n == CLEAVER || n == BROAD || n == CHAIN || n == SHOVEL || n == HALBERD) && testbit(inven,n)) && n < NUMOFOBJECTS; n++);
-       if (n == NUMOFOBJECTS)
-               puts("You don't have suitable weapons to kill.");
-       else {
-               printf("Your %s should do the trick.\n",objsht[n]);
-               while (wordtype[++wordnumber] == ADJS);
-               switch(wordvalue[wordnumber]){
-                       
+       for (n = 0; !((n == SWORD || n == KNIFE || n == TWO_HANDED || n == MACE || n == CLEAVER || n == BROAD || n == CHAIN || n == SHOVEL || n == HALBERD) && testbit(inven, n)) && n < NUMOFOBJECTS; n++);
+       if (n == NUMOFOBJECTS) {
+               if (testbit(inven, LASER)) {
+                       printf("Your laser should do the trick.\n");
+                       n = wordnumber + 1;
+                       switch(wordvalue[n]) {
                        case NORMGOD:
-                               if (testbit(location[position].objects,BATHGOD)){
-                                       puts("The goddess's head slices off.  Her corpse floats in the water.");
-                                       clearbit(location[position].objects,BATHGOD);
-                                       setbit(location[position].objects,DEADGOD);
-                                       power += 5;
-                                       notes[JINXED]++;
-                               } else if (testbit(location[position].objects,NORMGOD)){
-                                       puts("The goddess pleads but you strike her mercilessly.  Her broken body lies in a\npool of blood.");
-                                       clearbit(location[position].objects,NORMGOD);
-                                       setbit(location[position].objects,DEADGOD);
-                                       power += 5;
-                                       notes[JINXED]++;
-                                       if (wintime)
-                                               live();
-                               } else puts("I dont see her anywhere.");
-                               break;
                        case TIMER:
-                               if (testbit(location[position].objects,TIMER)){
-                                       puts("The old man offers no resistance.");
-                                       clearbit(location[position].objects,TIMER);
-                                       setbit(location[position].objects,DEADTIME);
-                                       power++;
-                                       notes[JINXED]++;
-                               } else puts("Who?");
-                               break;
                        case NATIVE:
-                               if (testbit(location[position].objects,NATIVE)){
-                                       puts("The girl screams as you cut her body to shreds.  She is dead.");
-                                       clearbit(location[position].objects,NATIVE);
-                                       setbit(location[position].objects,DEADNATIVE);
-                                       power += 5;
-                                       notes[JINXED]++;
-                               } else puts("What girl?");
-                               break;
                        case MAN:
-                               if (testbit(location[position].objects,MAN)){
-                                       puts("You strike him to the ground, and he coughs up blood.");
-                                       puts("Your fantasy is over.");
-                                       die();
-                               }
+                               wordvalue[wordnumber] = SHOOT;
+                               cypher();
+                               break;
                        case -1:
                                puts("Kill what?");
                                break;
-
                        default:
-                               if (wordtype[wordnumber] != NOUNS)
-                                       puts("Kill what?");
+                               if (wordtype[n] != OBJECT ||
+                                   wordvalue[wordnumber] == EVERYTHING)
+                                       puts("You can't kill that!");
                                else
-                                       printf("You can't kill the %s!\n",objsht[wordvalue[wordnumber]]);
+                                       printf("You can't kill the %s!\n",
+                                           objsht[wordvalue[n]]);
+                               break;
+                       }
+               } else
+                       puts("You don't have suitable weapons to kill.");
+       } else {
+               printf("Your %s should do the trick.\n", objsht[n]);
+               wordnumber++;
+               switch (wordvalue[wordnumber]) {
+
+               case NORMGOD:
+                       if (testbit(location[position].objects, BATHGOD)) {
+                               puts("The goddess's head slices off.  Her corpse floats in the water.");
+                               clearbit(location[position].objects, BATHGOD);
+                               setbit(location[position].objects, DEADGOD);
+                               power += 5;
+                               notes[JINXED]++;
+                       } else
+                               if (testbit(location[position].objects, NORMGOD)) {
+                                       puts("The goddess pleads but you strike her mercilessly.  Her broken body lies in a\npool of blood.");
+                                       clearbit(location[position].objects, NORMGOD);
+                                       setbit(location[position].objects, DEADGOD);
+                                       power += 5;
+                                       notes[JINXED]++;
+                                       if (wintime)
+                                               live();
+                               } else
+                                       puts("I dont see her anywhere.");
+                       break;
+               case TIMER:
+                       if (testbit(location[position].objects, TIMER)) {
+                               puts("The old man offers no resistance.");
+                               clearbit(location[position].objects, TIMER);
+                               setbit(location[position].objects, DEADTIME);
+                               power++;
+                               notes[JINXED]++;
+                       } else
+                               puts("Who?");
+                       break;
+               case NATIVE:
+                       if (testbit(location[position].objects, NATIVE)) {
+                               puts("The girl screams as you cut her body to shreds.  She is dead.");
+                               clearbit(location[position].objects, NATIVE);
+                               setbit(location[position].objects, DEADNATIVE);
+                               power += 5;
+                               notes[JINXED]++;
+                       } else
+                               puts("What girl?");
+                       break;
+               case MAN:
+                       if (testbit(location[position].objects, MAN)) {
+                               puts("You strike him to the ground, and he coughs up blood.");
+                               puts("Your fantasy is over.");
+                               die();
+                       }
+               case -1:
+                       puts("Kill what?");
+                       break;
+
+               default:
+                       if (wordtype[wordnumber] != OBJECT ||
+                           wordvalue[wordnumber] == EVERYTHING)
+                               puts("You can't kill that!");
+                       else
+                               printf("You can't kill the %s!\n",
+                                   objsht[wordvalue[wordnumber]]);
                }
        }
 }
 
+void
 ravage()
 {
        while (wordtype[++wordnumber] != NOUNS && wordnumber <= wordcount);
-       if (wordtype[wordnumber] == NOUNS && testbit(location[position].objects,wordvalue[wordnumber])){
-               time++;
-               switch(wordvalue[wordnumber]){
-                       case NORMGOD:
-                               puts("You attack the goddess, and she screams as you beat her.  She falls down");
-                               puts("crying and tries to hold her torn and bloodied dress around her.");
-                               power += 5;
-                               pleasure += 8;
-                               ego -= 10;
-                               wordnumber--;
-                               godready = -30000;
-                               murder();
-                               win = -30000;
-                               break;
-                       case NATIVE:
-                               puts("The girl tries to run, but you catch her and throw her down.  Her face is");
-                               puts("bleeding, and she screams as you tear off her clothes.");
-                               power += 3;
-                               pleasure += 5;
-                               ego -= 10;
-                               wordnumber--;
-                               murder();
-                               if (rnd(100) < 50){
-                                       puts("Her screams have attracted attention.  I think we are surrounded.");
-                                       setbit(location[ahead].objects,WOODSMAN);
-                                       setbit(location[ahead].objects,DEADWOOD);
-                                       setbit(location[ahead].objects,MALLET);
-                                       setbit(location[back].objects,WOODSMAN);
-                                       setbit(location[back].objects,DEADWOOD);
-                                       setbit(location[back].objects,MALLET);
-                                       setbit(location[left].objects,WOODSMAN);
-                                       setbit(location[left].objects,DEADWOOD);
-                                       setbit(location[left].objects,MALLET);
-                                       setbit(location[right].objects,WOODSMAN);
-                                       setbit(location[right].objects,DEADWOOD);
-                                       setbit(location[right].objects,MALLET);
-                               }
-                               break;
-                       default:
-                               puts("You are perverted.");
+       if (wordtype[wordnumber] == NOUNS && testbit(location[position].objects, wordvalue[wordnumber])) {
+               ourtime++;
+               switch (wordvalue[wordnumber]) {
+               case NORMGOD:
+                       puts("You attack the goddess, and she screams as you beat her.  She falls down");
+                       puts("crying and tries to hold her torn and bloodied dress around her.");
+                       power += 5;
+                       pleasure += 8;
+                       ego -= 10;
+                       wordnumber--;
+                       godready = -30000;
+                       murder();
+                       win = -30000;
+                       break;
+               case NATIVE:
+                       puts("The girl tries to run, but you catch her and throw her down.  Her face is");
+                       puts("bleeding, and she screams as you tear off her clothes.");
+                       power += 3;
+                       pleasure += 5;
+                       ego -= 10;
+                       wordnumber--;
+                       murder();
+                       if (rnd(100) < 50) {
+                               puts("Her screams have attracted attention.  I think we are surrounded.");
+                               setbit(location[ahead].objects, WOODSMAN);
+                               setbit(location[ahead].objects, DEADWOOD);
+                               setbit(location[ahead].objects, MALLET);
+                               setbit(location[back].objects, WOODSMAN);
+                               setbit(location[back].objects, DEADWOOD);
+                               setbit(location[back].objects, MALLET);
+                               setbit(location[left].objects, WOODSMAN);
+                               setbit(location[left].objects, DEADWOOD);
+                               setbit(location[left].objects, MALLET);
+                               setbit(location[right].objects, WOODSMAN);
+                               setbit(location[right].objects, DEADWOOD);
+                               setbit(location[right].objects, MALLET);
+                       }
+                       break;
+               default:
+                       puts("You are perverted.");
                }
-       }
-       else
+       } else
                puts("Who?");
 }
 
+int
 follow()
 {
-       if (followfight == time){
-               puts("The Dark Lord leaps away and runs down secret tunnels and corridoors.");
+       if (followfight == ourtime) {
+               puts("The Dark Lord leaps away and runs down secret tunnels and corridors.");
                puts("You chase him through the darkness and splash in pools of water.");
                puts("You have cornered him.  His laser sword extends as he steps forward.");
                position = FINAL;
-               fight(DARK,75);
-               setbit(location[position].objects,TALISMAN);
-               setbit(location[position].objects,AMULET);
-               return(0);
-       }
-       else if (followgod == time){
-               puts("The goddess leads you down a steamy tunnel and into a high, wide chamber.");
-               puts("She sits down on a throne.");
-               position = 268;
-               setbit(location[position].objects,NORMGOD);
-               notes[CANTSEE] = 1;
-               return(0);
-       }
-       else 
-               puts("There is no one to follow.");
-       return(-1);
+               fight(DARK, 75);
+               setbit(location[position].objects, TALISMAN);
+               setbit(location[position].objects, AMULET);
+               return (0);
+       } else
+               if (followgod == ourtime) {
+                       puts("The goddess leads you down a steamy tunnel and into a high, wide chamber.");
+                       puts("She sits down on a throne.");
+                       position = 268;
+                       setbit(location[position].objects, NORMGOD);
+                       notes[CANTSEE] = 1;
+                       return (0);
+               } else
+                       puts("There is no one to follow.");
+       return (-1);
 }