
inherit "/d/Imperium/Nuln/std/npc";

#include <silvy.h>

#define ELEAR_KAN_I_HACZYK     "_elear_kan_i_haczyk"
#define ELEAR_KAN_I_SCIERWO    "_elear_kan_i_scierwo"
#define ELEAR_KAN_I_WEDKA      "_elear_kan_i_wedka"
#define ELEAR_KAN_I_DOSTAL     "_elear_kan_i_dostal"
#define ELEAR_KAN_I_WYLOWIL    "_elear_kan_i_wylowil"

object gracz;
int zajety;
// Ten obiekt bedzie nam potrzebny pozniej, musimy go zadeklarowac.
void ile_doswiadczenia(object who);
void oddaj_rzecz(object ob, object from);
void oddal_pierscien(object from);

void
create_mieszczanin_nuln()
{
    ustaw_jak_daleko(3);
    ustaw_czy_wraca(1);

    ustaw_imie(({"igor","igora","igorowi","igora","igorem","igorze"}),
        PL_MESKI_OS);

    dodaj_przym("zielonooki", "zielonoocy");
    dodaj_przym("wysoki","wysocy");
        
    set_gender(G_MALE);

    set_long("Widzisz przed soba wysokiego mezczyzne. Jego szczupla " +
                 "sylwetka nadaje mu dostojnosci. Dlugie, ciemne wlosy " +
                 "opadaja na delikatne ramiona, zapewne " +
                 "nie utrudzone ciezka praca. Oszczedne i pelne gracji " + 
                 "ruchy wyrozniaja go sposrod tlumu.\n");
        
    ustaw_odmiane_rasy(PL_CZLOWIEK);

    add_prop(CONT_I_WEIGHT,      70000);
    add_prop(CONT_I_HEIGHT,      180);
        add_prop(IMPERIUM_LIVE_I_NULN_CITIZEN, 1);
        set_default_answer(QCIMIE(TO,PL_MIA) + " odpowiada: Niestety " +
        "nie wiem, o czym mowisz.\n");

    set_stats(({50, 65, 40, 40, 60, 35}));

    set_act_time(15+random(10));
        
    add_act("emote rozglada sie.");
    add_act("emote przestepuje z nogi na noge.");
    add_act("emote poprawia wlosy.");
    add_act("emote wzdycha.");
    add_act("emote mowi: Gdzie on moze byc?");
    add_act("emote mowi: Musze go odnalezc. Koniecznie musze go odnalezc.");
    add_act("emote mowi: Wszystko przez ten alkohol.");
        
    add_ask(({"pomoc","zadanie","prace"}), VBFC_ME("quest_hint"));
    add_ask(({"pierscien", "pierscionek"}), VBFC_ME("pierscien_hint"));
    add_ask(({"wieczor", "karczme","picie"}), VBFC_ME("wieczor_hint"));
    
        remove_prop(NPC_M_NO_ACCEPT_GIVE);
    seteuid(getuid());

    set_skill(SS_WEP_SWORD, 50);
    set_skill(SS_PARRY, 30);
    
    add_weapon(NPATH + "bronie/miecz2.c");

}

string
query_presentation()
{
    return"Igor Svetlin, czlowiek";
}


varargs void 
return_intro(string kto)
{
    command("przedstaw sie " + find_player(kto)->query_real_name(PL_CEL));
}
// Dwie powyzsze funkcje pozwalaja naszemu elfowi przedstawiac sie.

void
add_introduced(string imie)
{
    set_alarm(2.0,0.0,"return_intro", imie);
}

varargs string          /* varags oznacza, ze nie trzeba podawac wszystkich */
quest_hint(int faza)    /* argumentow. Jesli nie poda sie, to faza = 0 */
{
/* Za kazdym razem, gdy ma powiedziec jakas kwestie, sprawdzamy, czy gracz
 * jeszcze go slucha ... :-)
 */
    if (faza)
    if (!present(gracz, environment(this_object())))
    {
        command("powiedz Co za impertynencja!");
        command("emote kiwa glowa z niesmakiem."); 
        zajety = 0;
        return "";
    }
// To bylo jesli gracz juz sobie poszedl.
    switch(faza)
    {
        case 0: if(zajety)
		   {
		     command("powiedz Chwileczke, daj mi skonczyc.");
		     return"";
		   }
        	
        	/* Zapamietujemy gracza w zmiennej, bo w alarmach this_player()
		 * nie dziala
		 */
                gracz = this_player();
                
                /* Zaczyna gadac. Sprawdzamy, czy gracz zrobil questa, itd. */
            if (gracz->test_bit("imperium", 0, 1))
// Sprawdzamy czy gracz ma juz zrobiony quest, to znaczy czy ma ustawiony
// 'bit' tego questa jako aktywny. Jesli tak to:
            {
                command("emote namysla sie przez chwile.");
                command("emote mowi: Dziekuje, ze pytasz, ale nie potrzebna " +
                   "juz mi twoja pomoc.");
                command("emote usmiecha sie przyjaznie."); 
                return "";
                /* Wyjscie z funkcji */
            }
            
            if (gracz->query_prop(ELEAR_KAN_I_DOSTAL))
// Jesli gracz ma juz tego propa, to znaczy ze wysluchal juz tego, co
// Herman ma do powiedzenia.
            {
               command("powiedz Ile razy mam ci powtarzac? Masz znalezc moj pierscien.");
               command("rozejrzyj sie gniewnie"); 
               return "";
               /* Wyjscie z funkcji */
            }
// Jesli dwia poprzednie warunki nie byly spelnione, to znaczy, ze
// gracz nie robil jeszcze tego questa i nie sluchal Hermana. Mozna mu
// powiedziec o zadaniu.

   
   zajety = 1;
            command("emote usmiecha sie.");
            command("powiedz Wlasnie kogos takiego jak ty szukalem.");

            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 1: /* kontunacja gadki */
            command("emote mowi: Mam straszny problem.");
            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 2:
            command("emote wyjasnia: Przyjechalem niedawno do Nuln z mego " +
                "rodzinnego Kisleva. Mam tu rodzine, no wiesz, bylo sie gdzie " +
                "zaczepic.");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 3:
            command("emote mowi: No i pewnego wieczora ... No wiesz ... Wypilem w " +
                "karczmie troche za duzo ... no i ...");
            command("emote drapie sie po glowie.");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 4:
            command("emote mowi: Zgubilem moj rodowy pierscien. Pamiatke po ojcu.");
            set_alarm(5.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 5:
            command("emote drapie sie po glowie.");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 6:
            command("emote mowi: Najgorzej, ze rodzina moze to zobaczyc, a wtedy ... " +
                "bedzie krucho ze mna.");
            set_alarm(2.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 7:
            command("emote mowi: Przynies go, a sowicie ci to wynagrodze.");
            gracz->add_prop(ELEAR_KAN_I_DOSTAL, 1); 
                      /* zaznaczamy sobie, ze gracz   */
                      /* uslyszal to co trzeba        */
            zajety = 0;
            break;
    }
    return "";
    /* Wyjscie z funkcji */
}
// Cala gadka podana jest w fazach, zeby nie walnac calego tekstu graczowi ciurkiem.
// W kazdej fazie sprawdzane jest czy gracz jeszcze slucha.
varargs string
pierscien_hint(int faza)
{
// Kolejne podpowiedzi.
    switch(faza)
    {
     case 0:
    
   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
   zajety = 1;

       command("emote mowi: No wiesz, pierscien ten mamy od pokolen. Dostaje " +
           "go zawsze najstarszy mezczyzna w rodzinie. Mnie obdarowal nim ojciec, "+
           "jego dziadek.");
       command("emote zastanawia sie chwile.");
       command("emote mowi: Owszem, jest zloty, ale wartosc ma niewielka.");    
      set_alarm(4.0,0.0, "pierscien_hint", (faza + 1));
      break;

     case 1:
       command("emote mowi: Ot, zwykla zlota obraczka.");
      set_alarm(7.0,0.0, "pierscien_hint", (faza + 1));
      break;

     case 2:
       command("emote zaglada do swego mieszka.");
       command("emote mowi: Dam ci piec zlotych monet, jesli mi go przyniesiesz.");
       command("emote usmiecha sie z nadzieja.");
      set_alarm(7.0,0.0, "pierscien_hint", (faza + 1));
      zajety = 0;
      break;

    }
    return"";
}

varargs string
wieczor_hint(int faza)
{
    switch(faza)
    {
     
     case 0:

   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
   zajety = 1;        
        command("emote mowi: Hmmm ... Niewiele pamietam. To bylo juz pare " +
            "dni temu. Wyszlismy z kompania z karczmy.");
        command("emote zarzeka sie: Tylko nie mysl, ze to byly jakies moczymordy. " +
            "Z takimi nie przestaje.");    
      set_alarm(4.0,0.0, "wieczor_hint", (faza +1));
      break;

     case 1:
  
       command("emote zastanawia sie przez chwile.");
      set_alarm(7.0,0.0, "wieczor_hint", (faza +1));
      break;

     case 2:

       command("emote mowi: Oj, wesolo bylo.");
       command("emote usmiecha sie pod nosem.");
      set_alarm(7.0,0.0, "wieczor_hint", (faza +1));
      break;

     case 3:

       command("emote mowi: No i wtedy potknalem sie na kocim lbie. " +
           "Mogliby ciury wyremontowac te ulice. Padlem jak dlugi i pierscien " +
           "zsunal mi sie z palca.");
      set_alarm(7.0,0.0, "wieczor_hint", (faza +1));
      break;

     case 4:

       command("emote wzdycha.");
       command("emote dodaje: Pech chcial, ze byl tam otwor sciekowy i moj pierscien "+
           "potoczyl sie do niego jak po sznurku.");
       command("emote mowi: Ot i cala historia.");     
        set_alarm(10.0,0.0, "wieczor_hint", (faza +1));
       zajety = 0;
       break;

    }
    return"";
}


void
enter_inv(object ob, object from)
{
// Funkcja wywolywana w obiekcie automatycznie gdy ktos cos mu daje.
// Maskujemy ja zeby sprawdzic co tez dostalismy od gracza.
   ::enter_inv(ob, from);
// Wywolujemy oryginalna funkcje enter_inv - wszystko musi sie 
// odbywac jak zwykle, chodzi nam tylko o sprawdzenie.
    if(function_exists("create_heap",ob))
    {
      command("usmiechnij sie przebie");
      return; 
    }

   if(!from) return;
   if(ob->id("_pierscien_igora_"))
// Jesli ten przedmiot to wlasnie amulet to wywolujemy funkcje
// oddal_medalion.
// W pliku amuletu dodajemy mu add_name("_amulet_hermana_");
// Patrz plik amulet.c
   {
       set_alarm(1.0, 0.0, &oddal_pierscien(from));
       return;
   }
// Jesli to bylo co innego to oddajemy - funkcja oddaj_rzecz.
   set_alarm(1.0, 0.0, &oddaj_rzecz(ob, from));
   return;
}

void
oddaj_rzecz(object ob, object from)
{
    string what, who;

    what = lower_case(ob->query_ustaw_nazwe());
// Nazwa przedmiotu.
    who = from->query_real_name();
// Imie gracza ( mala litera ).
    command("emote kreci glowa z dezaprobata. ");
    command("emote mowi: To zdecydowanie nie jest moj pierscien.");
    command("daj " + ob->query_nazwa(3) + " " + from->query_nazwa(2));
} 

void
oddal_pierscien(object from)
{
   string who,
   what;
   
   who = from->query_real_name();
// Imie gracza mala litera.   
   if (!from->query_prop(ELEAR_KAN_I_DOSTAL))
   {
      command("emote mowi: Moj pierscien! Skad wiedzial"+from->koncowka("es","as")+" ze go zgubilem? Dzieki!"); 
      return;
// Jesli gracz nie ma tego propa, znaczy ze nie dostal questa od
// Hermana, nie sluchal hintow - amulet pewnie znalazl.
// Nie dostanie expow.
   }
   command("emote patrzy z niedowierzaniem.");
   command("emote mowi: To moj pierscien. Znalazl"+from->koncowka("es","as")+" go!"); 
   ile_doswiadczenia(from);
// Wywolanie funkcji dajacej doswiadczenie.   
   command("emote znika ci z oczu.");
   remove_object();
// Herman znika.   
}

void
ile_doswiadczenia(object who)
{
// Funkcja uruchamiana, gdy gracz dostarczyl Hermanowi poszukiwany 
// medalion.
   int xp_base = 7000;
// Podstawa expow za danego questa.   
   if (who->test_bit("imperium", 0, 1))
   {
// Jesli gracz robil juz tego questa, to nie moze dostac expow po raz
// drugi.
      who->catch_msg("To milo, ze znowu mi pomogles.\n");
      return;
   }
   
   xp_base -= (who->query_prop(ELEAR_KAN_I_HACZYK) ? 0 : 1500);
   xp_base -= (who->query_prop(ELEAR_KAN_I_SCIERWO) ? 0 : 1500);
   xp_base -= (who->query_prop(ELEAR_KAN_I_WEDKA) ? 0 : 1500);
   xp_base -= (who->query_prop(ELEAR_KAN_I_WYLOWIL) ? 0 : 1500); 

   who->catch_msg("Czujesz sie bardziej doswiadczon" +
   	who->koncowka("y","a") + ".\n");
   who->add_exp(xp_base, 0);

   command("powiedz Oto twoja nagroda!");
   write(query_Imie(this_object(),PL_MIA) + " daje ci 5 zlotych monet.\n");
   MONEY_MAKE_GC(5)->move(who);


   who->set_bit(0, 1);

   seteuid("silvy");
   write_file("/d/Imperium/private/questlog/0_1.log",
              ctime(time()) + ": " + who->query_name() + ", " + xp_base
            + " xp\n");
// Zapisujemy fakt zrobienia questa przez gracza do logu danego questa,
// razem z iloscie punktow, ktore dostal i data.
   return;
}

