/* NPC reagujacy na emoty i przedstawiajacy sie.
 * Thomas Schutz, opiekun mostu.
 * by Mithandir, 08.01.1998
 *
 *	Wzialem sie za opisywanie funkcji w maszyna.c, wiec w thomasie tez
 *		opisze:
 *
 *      int trzezwy() zwraca 1 - trzezwy, 0 - pijany lub za chwile
 *
 *      string czy_pije() zwraca opis Thomasa. Tzn czy pije, czy spi, czy nic
 *
 *      void trzezwiej(int ktory_raz) Thomas trzezwieje lub zasypia.
 *           Powoli, ale zawsze :))
 *
 *      void ukryj(object co) Thomas chowa lapowki, zeby sie jakis
 *           gracz nie oblowil.
 *
 *      void za_malo(object kto, object co) lapowka ktora dal gracz byla za
 *           mala, ale Thomas ani mysli jej oddawac :)
 *
 *      void zaplacil(object kto, object co) Hmm, pekunia nie omlet,
 *           a dobry pieniadz nie jest zly :)). Thomas podnosi lub opuszcza
 *           most. Jesli most sie rusza, coz, pieniadze pana nie znaja.
 *
 *      void dal_akohol(object kto) Coz, czlowiek cale zycie sam siedzi,
 *           nudzi mu sie, nie ma sil, musi pic. Generalnie pije w czasie
 *           wolnym od sluzby :?, ale jak mu ktos da butelke, to nie pogardzi.
 *           Thomas sie spije i nie bedzie uwazal, co kto robi z dzwignia.
 *      void enter_inv(object ob, object from) maskujemy, zeby sprawdzic, czy
 *           To jest lapowka.
 *      int rusza_dzwignie() Sprawdza, czy Thomas jest trzezwy.
 *      UWAGA: cierpie, bo mi spacja siada. A dzisiaj w szkole byl laaaaaag!!!
 *
 */

inherit "/d/Imperium/std/monster"; /* jest to osobnik humanoidalny */

#include "mith.h"

int jak_pije;

string czy_pije();

void
create_monster()
{
    ustaw_imie(({"thomas", "thomasa", "thomasowi", "thomasa",
    		   "thomasem", "thomasie"}), PL_MESKI_OS);

    set_long("Jest to niewysokim, barczystym mezczyzna. Ubrany jest "
            +"w zwykly stroj mieszkancow Kreutzhofen. Jego rodzina od "
            +"pokolen zajmuje sie konserwacja i obsluga mostu. Thomas "
            +"jest powszechnie szanowany przez mieszkancow miasta za "
            +"swoje oddanie pracy. Polega ona glownie na podnoszeniu "
            +"mostu dla nadplywajacych lodzi i zapalaniu swiatel noca. "
            +"Bardzo nie lubi, kiedy ktos wkracza w jego kompetencje i "
            +"zazdrosnie strzeze dostepu do poruszajacej mostem "
            +"dzwigni.\n");

    ustaw_odmiane_rasy(PL_CZLOWIEK);

    set_gender(G_MALE);       

    dodaj_przym("barczysty","barczysci");
    dodaj_przym("niski","niscy");

    set_gender(0);
    add_prop(CONT_I_WEIGHT, 90000);
    add_prop(CONT_I_HEIGHT, 165); // 165 cm wzrostu...

    set_stats(({ 60, 60, 55, 50, 45, 40}));

    set_chat_time(10);
    add_chat("Witaj, Przybyszu!");
    add_chat("Skad przybywasz?");
    add_chat("Ladna, pogoda, nieprawdaz?");
    add_chat("Bylismy juz na drugiej stronie rzeki?");
    add_chat("Spojrz jaki piekny most!");
    add_chat("Ale mnie suszy w gardle!");

    set_cchat_time(5);
    add_cchat("A masz!");
    add_cchat("Nie bij mnie!");
    add_cchat("Jak zgine, kto bedzie pilnowal mostu?!");

    set_act_time(10);
    add_act(({"westchnij gleboko", "mruknij"}));
    add_act("emote patrzy rozmarzonym wzrokiem na most.");
    add_act("emote glaszcze dzwignie z miloscia.");

    remove_prop(NPC_M_NO_ACCEPT_GIVE);
}

void
add_introduced(string imie)
{
    set_alarm(2.0, 0.0, "return_introduce", find_player(imie));
}

void
return_introduce(object kto)
{
    command("przedstaw sie " + kto->query_real_name(PL_CEL));
}


string
query_presentation()
{
    return "Thomas Schutz, Operator Mostu Zwodzonego, czlowiek";
}
/*
To jest na razie wylaczone.

void
zapal_lampy()
{
                if (MECHZNIZM->czy_lampy_zapalone()) return;
                   MECHANIZM->zapal_lampy();
                   tell_room(environment(this_object()),
                       QCIMIE(this_object(),PL_MIA)+" zapala wiszace na "
                       +"moscie lampy, aby ostrzegaly nadplywajace lodzie o "
                       +"blokujacej rzeke przeszkodzie.\n");
}
void
zgas_lampy()
{
        if (!MECHANIZM->czy_lampy_zapalone()) return;
        MECHANIZM->zgas_lampy();
        tell_room(environment(this_object()),QCIMIE(this_object(),PL_MIA) +
        " gasi po koleji wiszace na moscie lampy.\n");
}

void
init()
{
        ::init();
        zapal_lampy();
}
*/

int
trzezwy()
{
        return !jak_pije;
}

string
czy_pije()
{
        if (!jak_pije) return "";
        if (jak_pije==1) return " W tym momencie jednak, zaniedbujac "
           +"obowiazki, Thomas spi spokojnie w swojej budce.";
        return " W tym momencie, miast pilnowac mostu, Thomas likwiduje "
               +"problem jakim jest butelka w jego reku, intensywnie "
               +"wlewajac jej zawartosc w siebie. Jest tym tak "
               +"pochloniety, ze nie zwraca uwagi na swiat wokol siebie.";
}


void
trzezwiej(int ktory_raz)
{
        if (ktory_raz)
        {
        add_prop(NPC_M_NO_ACCEPT_GIVE,"Thomas jest zbyt zajety oproznianiem "
              +"butelki, zeby cokolwiek od ciebie przyjac.\n");
                jak_pije=0;
                tell_room(environment(this_object())," Thomas wychodzi ze "
                    +"swojej budki, lekko chwiejac sie na nogach. Spoglada "
                    +"wokol nieprzytomnie ze skacowana mina, ale "
                    +"najwyrazniej odzyskal kontakt ze swiatem "
                    +"zewnetrznym.\n");
                return;
        }
        jak_pije=1;
        add_prop(NPC_M_NO_ACCEPT_GIVE,"Thomas jest nieprzytomny i nie moze "
            +"nic od ciebie przyjac.\n");
        tell_room(environment(this_object())," Thomas zasypia w swojej "
            +"budce. Na jakis czas most stal sie samoobslugowy.\n");
        set_alarm(300.0,0.0,&trzezwiej(1));
}

void
ukryj(object co)
{
        tell_room(environment(this_object())," Thomas znika za rogiem, "
              +"trzymajac cos kurczowo w zacisnietej piesci i prawie "
              +"natychmiast wraca z pustymi rekoma.\n");
        co->remove_object();
}

void
za_malo(object kto, object co)
{
        kto->catch_msg("Thomas mowi ci: O, dziekuje za wsparcie ciezko pracujacego "
             +"czlowieka! To podnoszenie mostu to taka meczaca "
             +"czynnosc!\n");
        set_alarm(5.0,0.0,"ukryj",co);
        return;
}

void
zaplacil(object kto, object co)
{
        if(MECHANIZM->moze_most_zarezerwowany())
	  {
               command("emote spluwa na ziemie.");
	       command("powiedz Nic z tego, cos blokuje most !");
          }
	else switch(MECHANIZM->most_sie_rusza())
        {
                case 1:
                      command("emote mowi: Hmm, chyba slyszalem syrene, trzeba "
                         +"podniesc most!");
                      kto->catch_msg("Thomas mruga do ciebie okiem!\n");
                      command("przesun dzwignie");
                      break;
                case 2:
                      command("emote mowi: Trzeba bedzie opuscic most. Juz nic nie "
                         +"plynie.");
                      command("przesun dzwignie");
                      break;
                case 0:
                      command("emote mowi: Jak pieknie dziala ten "
                        +"mechanizm. Szkoda, ze nie mozna go zatrzymac, "
                        +"zanim nie skonczy sie ruszac.");
        }
        set_alarm(5.0,0.0,"ukryj",co);
	return;
}

void
dal_alkohol(object kto)
{
        tell_room(environment(this_object())," Thomas zaszywa sie z "
            +"otrzymanym od " + QCIMIE(kto,PL_DOP) + " napitkiem w swojej "
            +"budce. Chyba bedzie przez chwile nieobecny duchem.\n",kto);
        kto->catch_msg(" Thomas zaszywa sie w swojej budce. Chyba przez "
            +"chwile bedzie nieobecny duchem.\n");
        jak_pije=2;
        set_alarm(150.0,0.0,&trzezwiej(0));
}

int
wartosc_lapowki(object ob)
{
        return (ob->heap_value()>100 || ob->query_prop(OBJ_I_VALUE)>200);
}

int
to_jest_to(object ob)
{
        return ob->query_alco_amount()>10;
}

void
enter_inv(object ob, object from)    // sprawdzamy, czy dostal lapowke
{
   ::enter_inv(ob, from);

   if (wartosc_lapowki(ob))
   {
       set_alarm(1.0, 0.0, "zaplacil",from,ob);
       return;
   }
   if (to_jest_to(ob))
   {
        set_alarm(1.0, 0.0, "dal_alkohol",from);
        return;
   }
   set_alarm(1.0, 0.0, "za_malo",from,ob);
   return;
}

int
rusza_dzwignie(object kto)
{
     if (trzezwy())
     {
	string kom=" Thomas wrzeszczy na "+ QCIMIE(kto,PL_BIE) + ": ";
	kto->catch_msg("Thomas wrzeszczy na ciebie: ");

	tell_room(environment(this_object()), kom, kto);
	kom=" Ty galganie! Nie ruszaj tej dzwigni! Bo jak ci "
	       +"porachuje kosci...\n";

	tell_room(NPATH+"mostn.c", kom);
	kto->catch_msg("Thomas mowi do ciebie cicho znaczacym tonem: - "
	       +"Mozemy sie dogadac, ale sam nie ruszaj dzwigni.\n");
	return 1;
     }
     else
     {
      tell_room(NPATH+"mostn.c", "Thomas mruczy cos niewyraznie "
          +"ze swojej budki.\n");
     return 0;
     }
}

void
emote_hook(string emote, object wykonujacy, string przyslowek)
{
    switch (emote)
    {
        case "kopnij": 
        case "spoliczkuj" :
        case "szturchnij":
        case "opluj" : set_alarm(2.0, 0.0, "zly", wykonujacy);
        	    break;
        	    
        case "zasmiej": set_alarm(2.0, 0.0, "return_laugh", wykonujacy);
        	      break;
        case "pocaluj":
        case "przytul": set_alarm(2.0, 0.0, "dobry", wykonujacy);
    }
}

void
return_laugh(object kto) 
{
    switch (random(5)) 
    {
      case 0 : command("zasmiej"); break;
      case 1 : command("emote smieje sie glosno."); break;
      case 2 : command("powiedz Co cie tak smieszy ? Moze moj most !?"); break;
      default:
        command("hmm");
    }
}

void
zly(object kto)
{
    command("powiedz Nie przeszkadzaj mi w pracy !");
    command("opluj " + OB_NAME(kto));
}

void
dobry(object kto) 
{
    int los;
    
    if(kto->koncowka("chlop","baba")=="chlop") zly(kto);
    else 
    {
        los = random(4);
    
        switch (los) 
        {
          case 0 : command("emote mowi: Ojej ..."); break;
          case 1 : command("emote czerwieni sie."); break;
          case 2 : command("emote mowi: Moze sie umowimy ?"); break;
          case 3 : zly(kto);
        }
    }
}