#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include "woerter.h"
#include "uhr.h"

extern Uhr Uhrzeit;

     // Diese Funktion liest eine Zeile Text von der Tastatur, ver-
     //  arbeitet sie und überprüft sie. Nur die bieden ersten
     //  Wörter werden beachtet.
void Woerter::HoleAnweisung(void)
{
enum Wort Wt1, Wt2;

   do
   {
	Uhrzeit.ZaehleUndGibAus();
	Verb = (enum Wort)0;
	Substantiv = (enum Wort)0;
	LiesEineZeile(Wt1, Wt2);			// Lies eine Zeile der Spielerin
	if (Wt1)						// Wenn Wt1 einen Wert hat
	{
	   if (IstEinVerb(Wt1)) Verb = Wt1;       //   ist es ein Verb
	   if (IstEinSubstantiv(Wt1)) Substantiv = Wt1; //   oder ein Substantiv
	}

	if (Wt2)					// Wenn Wt2 einen Wert hat
	{
	   if (IstEinVerb(Wt2))
	   {
		if (Verb == 0)
		{
		   Verb = Wt2;			// ist es ein Verb
		}
		else
		{
		   Verb = Substantiv = (enum Wort)0; // Zwei Verben, verboten!
		   cout << "Zwei Verben sind verboten, ignoriert!\n";
		}
	   }
	   if (IstEinSubstantiv(Wt2))
	   {
		if (Substantiv == 0)
		{
		   Substantiv = Wt2;		//  ist es ein Substantiv
		}
		else
		{
		   Verb = Substantiv = (enum Wort)0;
			cout << "Zwei Substantive sind verboten, ignoriert!\n";
		}
	   }
	}

	if ((Verb == 0) && (Substantiv != 0))
	{
	   Verb = Substantiv = (enum Wort)0;
	   cout << "Ein Verb muss sein, ignoriert!\n";
	}
   } while (Verb == 0);
}




     // Diese Funktion liest Wörter in ASCII von der Tastatur,
     //  wobei nach zwei Wörtern alles ignoriert wird. Die Wörter
     //  werdeb überprüft, ob sie im Wörterbuch sind, wie es
     //  durch die Variable "Wort" definiert wird.

static char EingabeZeile[80];  // Global, damit nächste Funktion sie verwenden kann
static int	StartCol;
void Woerter::LiesEineZeile(Wort &Wt1, Wort &Wt2)
{
char String1[25], String2[25], String3[25];
char LetzterBst;

   StartCol = 0;
   cin.getline(EingabeZeile, 80);			// Lies eine Zeile
   LetzterBst = HoleEinASCIIWort(String1);	// Lies erstes Wort
   if (LetzterBst != 0)
   {
	LetzterBst = HoleEinASCIIWort(String2);	// Lies das zweite Wort
	while (LetzterBst != 0)       // Ignoriere alles weiter
	{
	   LetzterBst = HoleEinASCIIWort(String3);
	}
   }
   else
   {
	String2[0] = 0;					// Kein zweites Wort
   }

   Wt1 = (enum Wort)FindeInWoerterbuch(String1);
   Wt2 = (enum Wort)FindeInWoerterbuch(String2);

}




     // Diese Funktion liest eine Zeichenkette, ignoriert dabei
     //  Leerzeichen am Beginn. Die Zeichenkette wird beim ersten
     //  nicht alphabetischen Zeichen abgeschlossen. Alle Buchstaben
     //  werden in Kleinbuchstaben umgewandelt.

int Woerter::HoleEinASCIIWort(char EinString[])
{
int BstZaehler = 0;
int BstGefunden = FALSE;
char C;

   for (int Index = StartCol ; Index < 80 ; Index++)
   {
	C = tolower(EingabeZeile[Index]);
	if (!C)			   // Ende der Zeile gefunden
	{
	   EinString[BstZaehler] = 0;
	   return C;
	}
	if (isalpha(C) && BstZaehler < 25)
	{
	   EinString[BstZaehler++] = C;
	   BstGefunden = TRUE;
	}
	else
	{
	   if (isspace(C) && !BstGefunden)
	   {
		;				    // Ignoriere führende Leerzeichen
	   }
	   else
	   {
		EinString[BstZaehler] = 0;  // ASCIIZ
		StartCol = Index;
		return C;
	   }
	}
   }
   return 0;
}




     // Diese Funktion verwendet das Wörterbuch, um die ASCII
     //  Eingabestrings in die internen Aufzählungswerte
     //  umzuwandeln. Diese Liste muss zusammen mit dem Aufzählungs-
     //  typen "Wort" geführt werden.

struct WbPaar
{
   char WbString[11];
   Wort GefundenesWort;
};

WbPaar Paar[] = {"norden"	,Norden,
		     "n"		,Norden,
		     "osten"	,Osten,
		     "o"		,Osten,
		     "sueden"	,Sueden,
		     "s"		,Sueden,
		     "westen"	,Westen,
		     "w"		,Westen,
		     "lege"       ,Lege,
		     "nimm"       ,Nimm,
		     "schau"	,Schau,
		     "rucksack"	,Rucksack,
		     "lies"       ,Lies,
		     "kauf"       ,Kauf,
		     "hilfe"	,Hilfe,
		     "aus"		,Aus,
		     "schluessel" ,Schluessel,
		     "konfekt"	,Konfekt,
		     "ticket"	,Ticket,
		     "geld"       ,Geld,
		     "monitor"	,Monitor,
		     "zeitung"	,Zeitung,
		     ""		,(enum Wort)0 };	 // Listenabschluss

int Woerter::FindeInWoerterbuch(char EinString[])
{
WbPaar *Zeiger = &Paar[0];

   if (EinString[0] == 0) return 0; // Kann nichts nachschauen
   do
   {
	if (strcmp(EinString, Zeiger->WbString) == 0)
	{
	   return Zeiger->GefundenesWort;
	}
	Zeiger = Zeiger + 1;		// Nächstes Wort in der Liste
   } while (Zeiger->GefundenesWort);	// Ende der Wortliste
   cout << "Ich weiá nicht, was " << EinString << " ist.\n";
   return 0;				// Wort nicht gefunden
}



    // Ist das Wort ein Verb?
int Woerter::IstEinVerb(enum Wort EingabeWort)
{
   return ((EingabeWort >= Norden) && (EingabeWort <= Aus));
}



    // Ist das Wort ein Substantiv?
int Woerter::IstEinSubstantiv(enum Wort EingabeWort)
{
   return ((EingabeWort >= Schluessel) && (EingabeWort <= Zeitung));
}



    // Ist das Wort eine Richtung?
int Woerter::IstEineRichtung(enum Wort EingabeWort)
{
   return ((EingabeWort >= Norden) && (EingabeWort <= Westen));
}



    // Ist das Wort eine Handlung?
int Woerter::IstEineHandlung(enum Wort EingabeWort)
{
   return ((EingabeWort >= Lege) && (EingabeWort <= Aus));
}
