Category : A Collection of Games for DOS and Windows
Archive   : ADVENT_.ZIP
Filename : ENGLISH.C

 
Output of file : ENGLISH.C contained in archive : ADVENT_.ZIP


/* program ENGLISH.C *\
\* WARNING: "advent.c" allocates GLOBAL storage space by *\
\* including "advdef.h". *\
\* All other modules use "advdec.h". */


#include "stdio.h" /* drv = 1.1st file 2.def 3.A */
#include "advent.h"
#include "advdec.h"

extern char *fgets();
extern int fputc();
extern int printf();
extern int sscanf();


/*
Analyze a two word sentence
*/
english()
{

char *msg;
int type1, type2, val1, val2;

verb = object = motion = 0;
type2 = val2 = -1;
type1 = val1 = -1;
msg = "bad grammar...";

getwords();

if (!(*word1))
return(0); /* ignore whitespace */
if (!analyze(word1, &type1, &val1)) /* check word1 */
return(0); /* didn't know it */

if (type1 == 2 && val1 == SAY) {
verb = SAY; /* repeat word & act upon if.. */
object = 1;
return(1);
}

if (*word2)
if (!analyze(word2, &type2, &val2))
return(0); /* didn't know it */

/* check his grammar */
if ((type1 == 3) && (type2 == 3) && \
(val1 == 51) && (val2 == 51)) {
outwords();
return(0);
}
else if (type1 == 3) {
rspeak(val1);
return(0);
}
else if (type2 == 3) {
rspeak(val2);
return(0);
}
else if (type1 == 0) {
if (type2 == 0) {
printf("%s\n", msg);
return(0);
}
else
motion = val1;
}
else if (type2 == 0)
motion = val2;
else if (type1 == 1) {
object = val1;
if (type2 == 2)
verb = val2;
if (type2 == 1) {
printf("%s\n", msg);
return(0);
}
}
else if (type1 == 2) {
verb = val1;
if (type2 == 1)
object = val2;
if (type2 == 2) {
printf("%s\n", msg);
return(0);
}
}
else
bug(36);
return(1);
}


/*
Routine to analyze a word.
*/
analyze(word, type, value)
char *word;
int *type, *value;
{
int wordval, msg;

/* make sure I understand */
if ((wordval = vocab(word, 0)) == -1) {
switch(rand() % 3) {
case 0:
msg = 60;
break;
case 1:
msg = 61;
break;
default:
msg = 13;
}
rspeak(msg);
return(0);

}
*type = wordval/1000;
*value = wordval%1000;
return(1);
}

/*
retrieve input line (max 80 chars), convert to lower case
& rescan for first two words (max. WORDSIZE-1 chars).
*/
getwords()
{
char words[80], *wptr;

fputc('>', stdout);
word1[0] = word2[0] = '\0';
fgets(words, 80, stdin);
wptr = words;
while (*wptr = tolower(*wptr))
++wptr;
sscanf(words, "%19s %19s", word1, word2);
if (dbugflg)
printf("WORD1 = %s, WORD2 = %s\n", word1, word2);
return;
}

/*
output adventure word list (motion/0xxx & verb/2xxx) only
6 words/line pausing at 20th line until keyboard active
*/
outwords()
{
int i, j, line;
char words[80];

j = line = 0;
for (i = 0; i < MAXWC; ++i) {
if ((wc[i].acode < 1000) || ((wc[i].acode < 3000) && \
(wc[i].acode > 1999))) {
printf("%-12s", wc[i].aword);
if ((++j == 6) || (i == MAXWC-1)) {
j = 0;
fputc('\n', stdout);
if (++line == 20) {
line = 0;
printf("\n\007Enter ");
printf(" to continue\n\n");
fgets(words, 80, stdin);
}
}
}
}
}