home *** CD-ROM | disk | FTP | other *** search
/ Oldies but Goodies / OldiesButGoodiesROMMANTechnologies1993.disc1of1.iso / adventur / english.c < prev    next >
Text File  |  1984-05-26  |  3KB  |  175 lines

  1.  
  2. /*    program ENGLISH.C                    *\
  3. \*    WARNING: "advent.c" allocates GLOBAL storage space by    *\
  4. \*        including "advdef.h".                *\
  5. \*        All other modules use "advdec.h".        */
  6.  
  7.  
  8. #include    "stdio.h"    /* drv = 1.1st file 2.def 3.A    */
  9. #include    "advent.h"
  10. #include    "advdec.h"
  11.  
  12. extern    char    *fgets();
  13. extern    int    fputc();
  14. extern    int    printf();
  15. extern    int    sscanf();
  16.  
  17.  
  18. /*
  19.     Analyze a two word sentence
  20. */
  21. english()
  22. {
  23.  
  24.     char    *msg;
  25.     int    type1, type2, val1, val2;
  26.  
  27.     verb = object = motion = 0;
  28.     type2 = val2 = -1;
  29.     type1 = val1 = -1;
  30.     msg = "bad grammar...";
  31.  
  32.     getwords();
  33.  
  34.     if (!(*word1))
  35.         return(0);        /* ignore whitespace    */
  36.     if (!analyze(word1, &type1, &val1))    /* check word1    */
  37.         return(0);        /* didn't know it    */
  38.  
  39.     if (type1 == 2 && val1 == SAY) {
  40.         verb = SAY;    /* repeat word & act upon if..    */
  41.         object = 1;
  42.         return(1);
  43.     }
  44.  
  45.     if (*word2)
  46.         if (!analyze(word2, &type2, &val2))
  47.             return(0);    /* didn't know it    */
  48.  
  49.     /* check his grammar */
  50.     if ((type1 == 3) && (type2 == 3) && \
  51.         (val1 == 51) && (val2 == 51)) {
  52.         outwords();
  53.         return(0);
  54.     }
  55.     else if (type1 == 3) {
  56.         rspeak(val1);
  57.         return(0);
  58.     }
  59.     else if (type2 == 3) {
  60.         rspeak(val2);
  61.         return(0);
  62.     }
  63.     else if (type1 == 0) {
  64.         if (type2 == 0) {
  65.             printf("%s\n", msg);
  66.             return(0);
  67.         }
  68.         else
  69.             motion = val1;
  70.     }
  71.     else if (type2 == 0)
  72.         motion = val2;
  73.     else if (type1 == 1) {
  74.         object = val1;
  75.         if (type2 == 2)
  76.             verb = val2;
  77.         if (type2 == 1) {
  78.             printf("%s\n", msg);
  79.             return(0);
  80.         }
  81.     }
  82.     else if (type1 == 2) {
  83.         verb = val1;
  84.         if (type2 == 1)
  85.             object = val2;
  86.         if (type2 == 2) {
  87.             printf("%s\n", msg);
  88.             return(0);
  89.         }
  90.     }
  91.     else
  92.         bug(36);
  93.     return(1);
  94. }
  95.  
  96.  
  97. /*
  98.         Routine to analyze a word.
  99. */
  100. analyze(word, type, value)
  101. char    *word;
  102. int    *type, *value;
  103. {
  104.     int    wordval, msg;
  105.  
  106.     /* make sure I understand */
  107.     if ((wordval = vocab(word, 0)) == -1) {
  108.         switch(rand() % 3) {
  109.         case 0:
  110.             msg = 60;
  111.             break;
  112.         case 1:
  113.             msg = 61;
  114.             break;
  115.         default:
  116.             msg = 13;
  117.         }
  118.         rspeak(msg);
  119.         return(0);
  120.     }
  121.     *type = wordval/1000;
  122.     *value = wordval%1000;
  123.     return(1);
  124. }
  125.  
  126. /*
  127.     retrieve input line (max 80 chars), convert to lower case
  128.      & rescan for first two words (max. WORDSIZE-1 chars).
  129. */
  130. getwords()
  131. {
  132.     char    words[80], *wptr;
  133.  
  134.     fputc('>', stdout);
  135.     word1[0] = word2[0] = '\0';
  136.     fgets(words, 80, stdin);
  137.     wptr = words;
  138.     while (*wptr = tolower(*wptr))
  139.         ++wptr;
  140.     sscanf(words, "%19s %19s", word1, word2);
  141.     if (dbugflg)
  142.         printf("WORD1 = %s, WORD2 = %s\n", word1, word2);
  143.     return;
  144. }
  145.  
  146. /*
  147.     output adventure word list (motion/0xxx & verb/2xxx) only
  148.     6 words/line pausing at 20th line until keyboard active
  149. */
  150. outwords()
  151. {
  152.     int    i, j, line;
  153.     char    words[80];
  154.  
  155.     j = line = 0;
  156.     for (i = 0; i < MAXWC; ++i) {
  157.         if ((wc[i].acode < 1000) || ((wc[i].acode < 3000) && \
  158.                                      (wc[i].acode > 1999))) {
  159.             printf("%-12s", wc[i].aword);
  160.             if ((++j == 6) || (i == MAXWC-1)) {
  161.                 j = 0;
  162.                 fputc('\n', stdout);
  163.                 if (++line == 20) {
  164.                     line = 0;
  165.                     printf("\n\007Enter <RETURN>");
  166.                     printf(" to continue\n\n");
  167.                     fgets(words, 80, stdin);
  168.                 }
  169.             }
  170.         }
  171.     }
  172. }
  173.  
  174.  
  175.