/*
 *  Funkcje obslugujace emoty.
 */

#define OGRY_I_NIE_MOZE_SIKAC "_ogry_i_nie_moze_sikac"

int
tytuly(string str)
{
	string *meskie= ({"Mlodzik",
			"Brzuchacz",
			"Smierdziel",
			"Obrzartuch",
			"Flakorwij",
			"Mlocarz",
			"Grzmociciel",
			"Wyrwidab",
			"Bohatyr Gorowy",
			"Herszt"});
	string *zenskie= ({"Mlodka",
			"Brzuchata",
			"Sierdziela",
			"Obrzartucha",
			"Flakrowija",
			"Mlocarka",
			"Wyrwigora",
			"Grzmocicielka",
			"Bohatyrka",
			"Hersztka"});
	string *tytuly=(TP->query_gender()?zenskie:meskie);
	write("Oto tytuly, ktore mozesz osiagnac w Ogrzej Kompanii:\n"+COMPOSITE_WORDS(tytuly)+".\n");
	return 1;

}

int
treningi(string str)
{
	write("Oto treningi, ktore dostepne w Ogrzej Kompanii ( na najwyzszym "+
	   "poziomie ):\n"+
	   "Maczugi:			niezle\n"+
	   "Wspinaczka:			dobrze\n"+
	   "Walka bez broni:		zadowalajaco\n"+
	   "Wyczuwanie kierunku:		zadowalajaco\n"+
	   "Plywanie:			dobrze\n"+
	   "Tropienie:			zadowalajaco\n"+
	   "Spostrzegawczosc:		niezle\n");
	return 1;
}
	   

	
	

int
zaburcz(string str)
{
    if (!str)
    {
        write("Burczy ci straszliwie w brzuchu. Zrob cos z tym, to niezdrowe.\n");
        allbb("wydaje sie byc straszliwie glodn"+TP->koncowka("y","a")+". Z "+TP->query_zaimek(PL_DOP, 1)+ " brzucha dochodza "+
              "takty marsza kiszek i inne juz mniej przyjemne dzwieki.");
        return 1;
    }
    notify_fail("Po prostu ozaburcz.\n");
    return 0;
}

int
zarechocz(string str)
{
    if (!str)
    {
        write("Rechoczesz donosnie, tupiac noga tak, ze kurz idzie.\n");
        allbb("rechocze donosnie, tupiac noga tak, ze kurz idzie.");
        return 1;
    }
    notify_fail("Po prostu ozarechocz.\n");
    return 0;
}


int
beknij(string str)
{
    if (!str)
    {
        write("Bekasz donosnie.\n");
        allbb("beka donosnie, tak z dna gardzieli. Powialo ci w twarz "+
        	"starym bigosem, fasola i czyms jeszcze, czego wolisz na "+
        	"razie nie identyfikowac.");
        
        return 1;
    }
    notify_fail("Po prostu obeknij.\n");
    return 0;
}

int
zamysl(string str)
{
    if (str=="sie")
    {
        write("Robisz skupiona mine i zaczynasz intensywnie myslec.\n");
        allbb("sapiac, zaczyna myslec. Widac to po glebokich bruzdach na "+TP->query_zaimek(PL_DOP, 1)+ " czole.");
        return 1;
    }
    notify_fail("Chyba ozamysl sie?\n");
    return 0;
}

int
zadudnij(string str)
{
    object *lokacje;
    object lokacja;
    int    i;
    int    ile;

    CHECK_MOUTH_BLOCKED;

    if (lokacja = environment(this_player()))
        lokacje = find_neighbour(({lokacja}), ({lokacja}), SHOUT_DEPTH);
    else
        lokacje = ({});

    str = str ? ": " + str : " glosno.";

    if (this_player()->query_option(OPT_ECHO))
        write("Dudnisz" + str + "\n");
    else
	 write("Ok.\n");

    i = -1;
    ile = sizeof(lokacje);
    while(++i < ile)
        tell_room(lokacje[i], "@@shout_name:" + file_name(this_object())
                + "@@ dudni" + str + "\n", this_player());

    return 1;
}

int
obliz(string str)
{
    object *cele;
    string ple;
  
    if (str=="sie")
    {
        write("Oblizujesz sie, chlapiac wokol slina.\n");
        allbb("oblizuje sie, chlapiac wokol slina.");
        return 1;
    }
    if (sizeof(cele=parse_this(str, "%l:" + PL_BIE)))
    {
        actor("Oblizujesz ze smakiem", cele, PL_BIE, ". Slluppp...");
	ple=comp_zaimki(cele, PL_DOP, 1); 
        all2actbb("oblizuje ze smakiem", cele, PL_BIE, ", pozostawiajac "+
                  "na "+ple+" wlosach blyszczaca warstwe sliny.");
        target("oblizuje cie ze smakiem. Ale mokro, fuj...", cele);
        cele->add_prop(LIVE_S_SOULEXTRA,
                       "ma na wlosach blyszczace, lepkie cos");
        return 1;
    }
    notify_fail("Oobliz [kogo]/sie?\n");
    return 0;
}

int
kichnij(string str)
{
    if (!str)
    {
        write("Kichasz solidnie.\n");
        tell_room(environment(this_player()),
                  "Nagly grzmot przeszywa cisze w promieniu wielu mil.\n");
        allbb("wyciera czerwony nos rabkiem rekawa.");
        return 1;
    }
    notify_fail("To polecenie nie przyjmuje zadnych argumentow.\n");
    return 0;
}

int
pogratuluj(string str)
{
    object *cele;
    string czego;

    CHECK_MOUTH_BLOCKED;
    notify_fail("Opogratuluj <komu> [czego] ?\n");
    if (!str) return 0;

    parse_command (str, Env, "%l:" + PL_CEL+" %s", cele, czego);
    cele=NORMAL_ACCESS(cele, 0,0);
    TP->set_obiekty_zaimkow(cele);
    if (czego && czego!="")
       	czego =" "+czego+".";
    else czego=".";
    
    if (sizeof(cele))
    {
	actor("Gratulujesz",cele, PL_CEL,czego);
        all2actbb("klepie", cele, PL_BIE, " spontanicznie po plecach, "+
                  "gratulujac "+comp_zaimki(cele,PL_CEL)+czego);
       target("klepie cie spontanicznie po twoich biednych plecach, "+
              "gratulujac ci" + czego,cele);
        return 1;
    }
 
    return 0;
}

int
pozdrow(string str)
{
    object *cele;
    string *jak, tmp;

    notify_fail("Opozdrow <kogo> [jak]?\n");
    if (!str) return 0;

    jak = parse_adverb_with_space(str, "radosnie", 1);
    if (jak[1]==" radosnie")
    {
    	parse_command(jak[0], Env, "%l:" + PL_BIE + " %s", cele, tmp);
    	cele=NORMAL_ACCESS(cele, 0, 0);
    	if (tmp && tmp!="") return 0;
    	TP->set_obiekty_zaimkow(cele);
    }
    else 
    {
         cele=parse_this(jak[0], "%l:" + PL_BIE);
    }

    if (sizeof(cele))
    {
        actor("Pozdrawiasz" + jak[1], cele, PL_BIE);
        all2actbb("macha do", cele, PL_DOP, " wielka lapa, pozdrawiajac "+comp_zaimki(cele, PL_BIE)+jak[1]+".");
        target("macha do ciebie wielka lapa, witajac cie" + jak[1] + ".", cele);
        return 1;
    }
    return 0;
}


int
pacnij(string str)
{
    object *cele;
    string *gdzie;

    gdzie = parse_adverb_with_space(str, "w leb", 1);
    cele = parse_this(gdzie[0], "%l:" + PL_BIE);
    if (sizeof(cele))
    {
        actor("Uderzasz", cele, PL_BIE, gdzie[1]+" swa wielka lapa.");
        all2actbb("uderza", cele, PL_BIE, gdzie[1]+" swa wielka lapa.");
        target("uderza cie"+gdzie[1]+" swa wielka lapa.", cele);
        return 1;
    }
    notify_fail("Opacnij <kogo> [jak] ?\n");
    return 0;
}

int
przepros(string str)
{
    object *kogo;
    string za_co;

    CHECK_MOUTH_BLOCKED;
    notify_fail("Oprzepros <kogo> [za <co>]?\n");
    if (!str) return 0;

    parse_command (str, Env, "%l:" + PL_BIE+" 'za' %s", kogo, za_co);
    kogo=NORMAL_ACCESS(kogo, 0,0);
    TP->set_obiekty_zaimkow(kogo);
    if (za_co && za_co!="")
       	za_co =" za "+za_co+".";
    else za_co=" ze skrucha.";
    
    if (sizeof(kogo))
    {
	actor("Przepraszasz",kogo, PL_BIE, za_co);
        all2actbb(" robi glupia mine i przeprasza", kogo, PL_BIE, za_co);
        target("robi glupia mine i przeprasza cie" + za_co, kogo);
        return 1;
    }
 
    return 0;
}

int
usmiechnij(string str)
{
    object *cele;
    string *jak, tmp;

    notify_fail("Ousmiechnij sie do <kogo> [jak]?\n");
    if (!str) return 0;
    jak = parse_adverb_with_space(str, "radosnie", 1);
    if (jak[1]==" radosnie")
    {
    	parse_command(jak[0], Env, "'sie' 'do' %l:" + PL_DOP + " %s", cele, tmp);
    	cele=NORMAL_ACCESS(cele, 0, 0);
    	if (tmp && tmp!="") return 0;
    	TP->set_obiekty_zaimkow(cele);
    }
    else 
    {
         cele=parse_this(jak[0], "'sie' 'do' %l:" + PL_DOP);
    }

    if (sizeof(cele))
    {
        actor("Rozdziawiasz"+jak[1]+" gebe, starajac sie usmiechnac do", cele, PL_DOP);
        all2actbb("rozdziawia"+jak[1]+" gebe, starajac sie usmiechnac do", cele, PL_DOP,".");
        target("rozdziawia"+jak[1]+" gebe, starajac sie usmiechnac do ciebie.", cele);
        return 1;
    }
    return 0;
}

int
spojrz(string str)
{
    object *cele;
    string *jak, tmp;

    notify_fail("Ospojrz na <kogo> [jak]?\n");
    if (!str) return 0;
    jak = parse_adverb_with_space(str, "tepo", 1);
    if (jak[1]==" tepo")
    {
    	parse_command(jak[0], Env, "'na' %l:" + PL_BIE + " %s", cele, tmp);
    	cele=NORMAL_ACCESS(cele, 0, 0);
    	if (tmp && tmp!="") return 0;
    	TP->set_obiekty_zaimkow(cele);
    }
    else 
    {
         cele=parse_this(jak[0], "'na' %l:" + PL_DOP);
    }

    if (sizeof(cele))
    {
        actor("Drapiesz sie po losmatym lbie, patrzac sie"+jak[1]+" na", cele, PL_BIE);
        all2actbb("drapie sie po kosmatym lbie, patrzac sie"+jak[1]+" na", cele, PL_BIE);
        target("drapie sie po kosmatym lbie, patrzac sie"+jak[1]+" na ciebie.", cele);
        return 1;
    }
    return 0;
}


int
zaklnij(string str)
{
    if (!str)
    {
        write("Starajac sie przypomniac sobie co ciekawsze powiedzonka, klniesz dajac wyraz swej frustracji i zdenerwowaniu.\n");
        tell_room(environment(this_player()),
                  "Powietrze przeszywa nagle seria ciekawych, ale niezbyt wykwitnych sformuowan, przerywana raz po raz krotkimi chwilami namyslu nad kolejnym wyrazeniem.\n");
        allbb("usmiecha sie z duma plynaca z dobrze spelnionego ogrzego obowiazku.");
        return 1;
    }
    notify_fail("To polecenie nie przyjmuje zadnych argumentow.\n");
    return 0;
}

int
zaspiewaj(string str)
{
    object *lokacje;
    object lokacja;
    int    i;
    int    ile;

    CHECK_MOUTH_BLOCKED;

    if (lokacja = environment(this_player()))
        lokacje = find_neighbour(({lokacja}), ({lokacja}), SHOUT_DEPTH);
    else
        lokacje = ({});

    str = str ? ": " + str : " jakas niezrozumiala piosenke.";

    if (this_player()->query_option(OPT_ECHO))
        write("Bierzesz gleboki oddech, i najglosniej jak potrafisz spiewasz" + str + "\n");
    else
	 write("Ok.\n");

    i = -1;
    ile = sizeof(lokacje);
    while(++i < ile)
        tell_room(lokacje[i], "@@shout_name:" + file_name(this_object())
                + "@@ glosem donosnym jak tartaczna pila, i rownie milym dla ucha, zaczyna spiewac"+ str + "\n", this_player());

    return 1;
}
	
int
chichocz(string str)
{
   CHECK_MOUTH_BLOCKED;
   
   if (!str)
      {
         write("Padasz na ziemie nie mogac utrzymac rownowagi ze smiechu. " +
           "Rechoczesz coraz glosniej czujac wyraznie bolaca przepone. " +
           "Po chwili chwiejac sie oslabiony wstajesz i wycierasz " +
           "mokre oczy.\n");
         allbb("pada na ziemie zwijajac sie w dzikim chichocie. Co chwila " +
           "kolejny wybuch smiechu zakloca spokoj okolicy, a on" +TP->koncowka("","a") +
           " zwija sie coraz czesciej w gwaltownych konwulsjach. Po chwili chwiejac sie " +
           "wstaje, ocierajac wilgotne od lez oczy.");
         return 1;
      }
   return notify_fail("Po prostu ochichocz.\n");
}

int
tupnij(string str)
{
   string *jak;
   
   if (!str) str="gwaltownie";
   
   jak=parse_adverb_with_space(str,"gwaltownie",1);
   
   if (jak[0]) return notify_fail("Otupnij [jak]?\n");
   
   write("Tupiesz" + jak[1] + " tak ze kurz wzbija sie w powietrze.\n");
   allbb("tupie" +jak[1] + " tak ze kurz wzbija sie w powietrze.");
   return 1;
}

int
nuda(string str)
{
   CHECK_MOUTH_BLOCKED;
   
   if (str=="sie")
      {
         write("Nie mogac dluzej zniesc bezczynnosci zaczynasz glosno liczyc " +
         	"wymyslane przez ciebie potwory. Jako zajecia to nie jest latwe, " +
         	"pomagasz sobie palcami obydwu rak, a czasami i nog.\n");
         allbb("ukazujac swoje znudzenie zaczyna glosno liczyc wymyslone potwory, " +
         	"pomagajac przy tym sobie palcami rak i nog.");
         return 1;
      }
   return notify_fail("Onudz sie?\n");
}

int
wygnij(string str)
{
   if (!str)
      {
         write("Wyginasz swe ogromne paluchy, a te chrupia w stawach glosno.\n");
         allbb("wygina swe ogromne paluchy, ktore wydaja przy tym gluche chrupniecia.");
         return 1;
      }
   return notify_fail("Po prostu owygnij.\n");
}

int
zignoruj(string str)
{
   object *cele;
   string ple;
   
   if (sizeof(cele=parse_this(str, "%l:" + PL_BIE)))
      {
         ple=comp_zaimki(cele, PL_DOP, 1);
         actor("Zaczynasz intensywnie lepic cos z " +
         	"zielonkawej substancji przed chwila dobytej wprost z nosa. " +
         	"Znajdujac w tym zajeciu przyjemna rozrywke, tworzysz coraz " +
         	"nowsze ksztalty, zupelnie nie zwracajac uwagi na",cele, PL_BIE);
         all2actbb("wklada jeden ze swych paluchow do nosa. Grzebie w nim " +
         	"zawziecie, by po chwili dobyc pewna ilosc zielonkawej substancji. " +
         	"Lepi z niej cos z duzym zaangazowaniem, zupelnie ignorujac przy tym",
         	cele,PL_BIE);
         target("wklada jeden ze swych paluchow do nosa. Grzebie w nim " +
         	"zawziecie, by po chwili dobyc pewna ilosc zielonkawej substancji. " +
         	"Lepi z niej cos z duzym zaangazowaniem, zupelnie nie zwracajac uwagi na ciebie.",cele);
         return 1;
      }
    
    return notify_fail("Ozignoruj <kogo>?\n");
}

int
prezentuj(string str)
{
    object bron=0;
    
    if (!str)
       {
          bron=TP->query_weapon(W_RIGHT);
          if (!bron) bron=TP->query_weapon(W_LEFT);
          if (!bron) bron=TP->query_weapon(W_BOTH);
          
          if (bron)
             {
                write("Naprezasz swoje miesnie tak az na ramionach wychodza " +
                 "ci wielkie zyly. Po chwili delikatnie gladzisz rekojesc " +
                 bron->short(PL_DOP) + " dajac innym do zrozumienia, ze " +
                 "walka z toba do pomylka.\n");
                say(QCIMIE(TP,PL_MIA) + " napreza swoje miesnie, a na " + 
                 TP->query_zaimek(PL_DOP,1) + " ramionach widac zarys " +
                 "ogromnych zyl, w ktorych niewatpliwie plynie goraca krew. " +
                 "Po chwili " + TP->query_zaimek(PL_DOP,1) + " ogromne paluchy " +
                 "delikatnie gladza rekojesc " + QSHORT(bron,PL_DOP) + 
                 ". Czujesz, ze kontakt z " + TP->query_zaimek(PL_DOP,1) +  
                 " bronia nie nalezy do przyjemnosci.\n");
             }
          else
             {
                write("Naprezasz swoje miesnie tak az na ramionach wychodza " +
                 "ci wielkie zyly. Po chwili naciskasz na swoje palce i daje " +
                 "sie slyszac trzask kosteczek. Jednoznacznie dajesz innym do " +
                 "zrozumienia, ze kontakt z twoja piescia nie nalezy do " +
                 "przyjemnosci.\n");
                say(QCIMIE(TP,PL_MIA) + " napreza swoje miesnie, a na " + 
                 TP->query_zaimek(PL_DOP,1) + " ramionach widac zarys " +
                 "ogromnych zyl, w ktorych niewatpliwie plynie goraca krew. " +
                 "Po chwili slychac gluchy trzask kosteczek. Czujesz, ze " +
                 "kontakt z " + TP->query_zaimek(PL_DOP,1) + " piescia " +
                 "nie nalezy do przyjemnosci.\n");
             }
          
          return 1;
       }
    
    return notify_fail("Po prostu oprezentuj.\n");
}

int
czy_buklak(object ob)
{
   if (function_exists("create_beczulka",ob)) return 1;
   return 0;
}

moze_sikac(object kto)
{
   kto->remove_prop(OGRY_I_NIE_MOZE_SIKAC);
   
   write("Czujesz, ze mozesz juz znowu nasikac do beczulki lub buklaka.\n");
}

int
nasikaj(string str)
{
   mixed oblist;
   object ob;
   
   notify_fail("Onasikaj gdzie?\n");
   
   if (str)
      {
         parse_command(str,TP,"'do' %i:"+PL_DOP,oblist);
         
         oblist=NORMAL_ACCESS(oblist,0,0);
         
         oblist=filter(oblist,czy_buklak);
         
         if (!sizeof(oblist)) return 0;
         
         if (TP->query_prop(OGRY_I_NIE_MOZE_SIKAC))
            {
               write("Nie jestes jeszcze w stanie tego zrobic.\n");
               return 1;
            } 
         
         if (sizeof(oblist)>1) return notify_fail("Nawet ogr" +
            TP->koncowka("","zyca") + " nie potrafi nasikac do " +
            "tylu miejsc naraz.\n");
         
         if (MASTER_OB(oblist[0])!=(ENGINE + "ogry_becz"))
            {
               if (oblist[0]->query_ilosc_plynu())
                  return notify_fail(C(oblist[0]->query_nazwa(PL_MIA)) + " nie jest " +
            	      "pus" + oblist[0]->koncowka("ty","ta","te","ci","te") + ".\n");
               setuid();
               seteuid(getuid());
               
               ob=clone_object(ENGINE + "ogry_becz");
               if (!ob->konfiguruj_z(oblist[0])) 
                  return notify_fail("Wystapil powazny blad. Zglos go opiekunowi gildii.\n");
                  
               ob->set_vol(0);
               ob->set_opis_plynu("zlotawego plynu");       
            }
         else ob=oblist[0];
         
         if (ob->query_pojemnosc()==ob->query_ilosc_plynu())
            {
               write(C(ob->query_nazwa(PL_MIA)) + " jest peln" +
                  ob->koncowka("y","a","e","i","e")+ ".\n");
               return 1;
            }
         
         ob->set_ilosc_plynu(ob->query_ilosc_plynu()+
                ob->query_pojemnosc()*TP->query_stat(SS_RACE)/100);
         
         TP->add_prop(OGRY_I_NIE_MOZE_SIKAC, 1);
         
         set_alarm(itof(600) + itof(random(8000))/itof(TP->query_stat(SS_RACE)), 0.0, &moze_sikac(TP));
         
         write("Z pelnym tlumionej uciechy usmiechem odchodzisz " +
            "w ustronne miejsce i z wielka pasja oddajesz sie blogiej " +
            "czynnosci, napelniajac jednoczesnie " + ob->query_nazwa(PL_BIE) +
            " zlotawym plynem. Po chwili wracasz, usmiechajac sie z glebokim " +
            "zadowoleniem i ulga.\n");
         say(QCIMIE(TP,PL_MIA) + " spoglada dziwnie na " + ob->query_nazwa(PL_BIE) +
            ". Na " + TP->query_zaimek(PL_DOP, 1) + " twarzy pojawia sie usmiech, " +
            "gdy odchodzi w ustronne miejsce. Po chwili wraca usmiechajac sie blogo, " +
            "najwyrazniej zaznal jakze rzadkich chwil szczescia.\n");
         
         
         return 1;
      }
   
 return 0;  
}