/*
                                Denise-MYTH Artificial Intelligence.

                                  Copyright (C) 2000 Szymon Jessa

                                         WERSJA ANGIELSKA:

This  program  is free software; you can redistribute it and/or modify it under the terms of the GNU
General  Public  License  as  published  by  the  Free  Software Foundation; either version 2 of the
License, or (at your option) any later version.

This  program  is  distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even  the  implied  warranty  of  MERCHANTABILITY  or  FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.

You  should  have received a copy of the GNU General Public License along with this program; if not,
write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

                                           WERSJA POLSKA:

Niniejszy   program   jest  oprogramowaniem  wolnodostëpnym;  moûesz  go  rozprowadzaê  dalej  i/lub
modyfikowaê na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundacjë Wolnodostëpnego
Oprogramowania - wedîug wersji 2-giej tej Licencji lub którejô z póúniejszych wersji.

Niniejszy   program  rozpowszechniany  jest  z  nadziejâ,  iû  bëdzie  on  uûyteczny  -  jednak  BEZ
JAKIEJKOLWIEK  GWARANCJI,  nawet  domyôlnej  gwarancji  PRZYDATNOÔCI  HANDLOWEJ albo PRZYDATNOÔCI DO
OKREÔLONYCH ZASTOSOWAÏ. W celu uzyskania bliûszych informacji - Powszechna Licencja Publiczna GNU.

Z  pewnoôciâ  wraz  z niniejszym programem otrzymaîeô teû egzemplarz Powszechnej Licencji Publicznej
GNU; jeôli nie - napisz do Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

                                              KONTAKT:

snail: Szymon Jessa, ul. Warszawska 20/6, 89-600 Chojnice,
email: smoczek@ue.eti.pg.gda.pl (ew. noco@box43.gnet.pl)
phone: (052) 39-707-88

****************************************************************************************************
*/
/*
   funkcje zadajâce pytania ogólne do podanego faktu (kim jest szymon?)
   wywoîywane w przypadkach:
   - zbyt niskiej korelacji faktów,
   - nie moûnoôci utworzenia pytania,
*/

char FROM quest_ogolne_osoba(struct fakt_struct *fakt,struct fleksja_struct *word,char klas_cech)
{
   /*
   OSOBA:
   <klasyfikacja>
   kto to jest/sâ...
   kim jest/sâ...
   <cechowanie>
   jaki/jaka/jakie jest/sâ...
   jakie cechy ma/majâ...
   co robi/robiâ...
   czym sië zajmuje/zajmujâ...
   */

   char txt[MAX_LINE_LENGHT];
   char liczba=*ptr_liczba(word->klon_head->dane);

   switch (klas_cech)
   {
      case KLASYFIKACJA:
         switch (drand() % 2)
         {
            case 0:
               if (fakt==rozmowca.fakt) sprintf(txt,"kim jesteô");
               else if (fakt==denise.fakt) sprintf(txt,"kim jestem");
               else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"kto to jest") : sprintf(txt,"kto to sâ");
               break;
            case 1:
               if (fakt==rozmowca.fakt) sprintf(txt,"kim jesteô");
               else if (fakt==denise.fakt) sprintf(txt,"kim jestem");
               else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"kim jest") : sprintf(txt,"kim sâ");
               break;
         }
         break;
      case CECHOWANIE:
         switch (drand() % 4)
         {
            case 0:
               switch (*ptr_rodzaj(word->klon_head->dane))
               {
                  case RODZAJ_MESKI:
                     if (fakt==rozmowca.fakt) sprintf(txt,"jaki jesteô");
                     else if (fakt==denise.fakt) sprintf(txt,"jaki jestem");
                     else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jaki jest") : sprintf(txt,"jacy sâ");
                     break;
                  case RODZAJ_ZENSKI:
                     if (fakt==rozmowca.fakt) sprintf(txt,"jaka jesteô");
                     else if (fakt==denise.fakt) sprintf(txt,"jaka jestem");
                     else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jaka jest") : sprintf(txt,"jakie sâ");
                     break;
                  case RODZAJ_NIJAKI:
                     if (fakt==rozmowca.fakt) sprintf(txt,"jakie jesteô");
                     else if (fakt==denise.fakt) sprintf(txt,"jakie jestem");
                     else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie jest") : sprintf(txt,"jakie sâ");
                     break;
               }
               break;
            case 1:
               if (fakt==rozmowca.fakt) sprintf(txt,"jakie masz cechy");
               else if (fakt==denise.fakt) sprintf(txt,"jakie mam cechy");
               else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie cechy ma") : sprintf(txt,"jakie cechy majâ");
               break;
            case 2:
               if (fakt==rozmowca.fakt) sprintf(txt,"co robisz");
               else if (fakt==denise.fakt) sprintf(txt,"co robië");
               else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"co robi") : sprintf(txt,"co robiâ");
               break;
            case 3:
               if (fakt==rozmowca.fakt) sprintf(txt,"czym sië zajmujesz");
               else if (fakt==denise.fakt) sprintf(txt,"czym sië zajmujë");
               else liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"czym sië zajmuje") : sprintf(txt,"czym sië zajmujâ");
               break;
         }
         break;
      default:
         con_put("bîâd: nieprawidîowe okreôlenie klas_cech w pytaniu ogólnym\n");
         return RESULT_NO_OK;
   }

   // jeôli to podmiot ROZMOWCA/DENISE to nie dopisujemy imienia
   if (fakt!=rozmowca.fakt && fakt!=denise.fakt)
   {
      strcat(txt," ");
      strcat(txt,word->wyraz);
   }

   strcat(txt,"?");
   short_info.output=DENISE_OUTPUT;
   con_put_dialog(PODMIOT_DENISE,txt,PRIORITY_QUEST_OG);

   return RESULT_OK;
}

char FROM quest_ogolne_rzecz(struct fakt_struct *fakt,struct fleksja_struct *word,char klas_cech)
{
   /*
   RZECZ:
   <klasyfikacja>
   co to jest/sâ...
   czym jest/sâ...
   <cechowanie>
   jaki/jaka/jakie jest/sâ...
   jakie cechy ma/majâ...
   jakie wîaôciwoôci ma/majâ...
   jakie zastosowanie ma/majâ...
   co robi/robiâ...
   jakâ rolë peîni/peîniâ...
   jakâ rolë speînia/speîniajâ...
   jakâ rolë ma/majâ...
   do czego sîuûy/sîuûâ...
   do czego jest/sâ... 
   */

   char txt[MAX_LINE_LENGHT];
   char liczba=*ptr_liczba(word->klon_head->dane);

   switch (klas_cech)
   {
      case KLASYFIKACJA:
         switch (drand() % 2)
         {
            case 0:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"co to jest") : sprintf(txt,"co to sâ");
               break;
            case 1:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"czym jest") : sprintf(txt,"czym sâ");
               break;
         }
         break;
      case CECHOWANIE:
         switch (drand() % 10)
         {
            case 0:
               switch (*ptr_rodzaj(word->klon_head->dane))
               {
                  case RODZAJ_MESKI:
                     liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jaki jest") : sprintf(txt,"jakie sâ");
                     break;
                  case RODZAJ_ZENSKI:
                     liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jaka jest") : sprintf(txt,"jakie sâ");
                     break;
                  case RODZAJ_NIJAKI:
                     liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie jest") : sprintf(txt,"jakie sâ");
                     break;
               }
               break;
            case 1:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie cechy ma") : sprintf(txt,"jakie cechy majâ");
               break;
            case 2:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie wîaôciwoôci ma") : sprintf(txt,"jakie wîaôciwoôci majâ");
               break;
            case 3:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakie zastosowanie ma") : sprintf(txt,"jakie zastosowanie majâ");
               break;
            case 4:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"co robi") : sprintf(txt,"co robiâ");
               break;
            case 5:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakâ rolë peîni") : sprintf(txt,"jakâ rolë peîniâ");
               break;
            case 6:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakâ rolë speînia") : sprintf(txt,"jakâ rolë speîniajâ");
               break;
            case 7:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"jakâ rolë ma") : sprintf(txt,"jakâ rolë majâ");
               break;
            case 8:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"do czego sîuûy") : sprintf(txt,"do czego sîuûâ");
               break;
            case 9:
               liczba==LICZBA_POJEDYNCZA ? sprintf(txt,"do czego jest") : sprintf(txt,"do czego sâ");
               break;
         }
         break;
      default:
         con_put("bîâd: nieprawidîowe okreôlenie klas_cech w pytaniu ogólnym\n");
         return RESULT_NO_OK;
   }

   strcat(txt," ");
   strcat(txt,word->wyraz);
   strcat(txt,"?");
   short_info.output=DENISE_OUTPUT;
   con_put_dialog(PODMIOT_DENISE,txt,PRIORITY_QUEST_OG);

   return RESULT_OK;
}

char FROM question_ogolne_main(struct fakt_struct *fakt,char klas_cech)
{
   char podst[MAX_LINE_LENGHT],odm[MAX_LINE_LENGHT];
   struct fleksja_struct *word;

   // okreôlenie czy to OSOBA, czy RZECZ i wywoîanie odpowiedniej funkcji
   if (fgrupa_get_body(fakt->obiekt_head->podstawowe,fakt->obiekt_head->ident_head->opis[0],podst)==RESULT_NO_OK) return RESULT_NO_OK;
   if (fgrupa_get_body(fakt->obiekt_head->odmienione,fakt->obiekt_head->ident_head->opis[0],odm)==RESULT_NO_OK) return RESULT_NO_OK;

   if ((word=fleksja_find(odm,podst,NULL,WITHOUT))==NULL) return RESULT_NO_OK;

   switch (*ptr_osobowosc(word->klon_head->dane))
   {
      case OSOBOWY: return quest_ogolne_osoba(fakt,word,klas_cech);
      case NIEOSOBOWY: return quest_ogolne_rzecz(fakt,word,klas_cech);
   }

   return RESULT_NO_OK;
}
