
/* Plik:        questowy.c
 * Autor:       Thalis
 * Data:        16.10.97
 * Last Update: 12.10.98 by Tigr (poprawienie bledow)
 * Opis: Npc dajacy questa, dajacy hinty questowe, odbierajacy 
 *       od gracza przedmiot questowy, dajacy mu punkty doswiadczenia.
 */        

inherit "/d/Imperium/std/monster.c";
// Dziedziczymy standardowego monster.c Imperium.
#include "silvy.h"
// Definicje.
#define PLAYER_I_DOSTAL_QUEST_HERMANA  "_player_i_dostal_quest_hermana"
// Definiujemy propa ktorego gracz bedzie dostawac razem z questem.
#define PLAYER_I_ZNALAZL_DZIEWCZYNE  "_player_i_znalazl_dziewczyne"
#define PLAYER_I_ROZMAWIAL_Z_MAMA    "_player_i_rozmawial_z_mama"
// Te dwa propy gracz moze dostac gdzie indziej, tu beda tylko
// sprawdzane przy nagradzaniu gracza. Niemniej jednak musimy
// je zdefiniowac ( tak samo jak w obiektach gdzie mozna je dostac ).
object gracz;
// Ten obiekt bedzie nam potrzebny pozniej, musimy go zadeklarowac.
int zajety;
// To bedzie potrzebne do sprawdzania czy ktos juz z nami gada
void ile_doswiadczenia(object who);
void oddaj_rzecz(object ob, object from);
void oddal_medalion(object from);
// Inicjujemy potrzebne nam pozniej funkcje.
void
create_monster()
{
// Standardowa funkcja npca.
    ustaw_nazwe(({"herman","hermana","hermanowi","hermana","hermanem",
      "hermanie"}), ({"hermany","hermanow","hermanom","hermany",
      "hermanami","hermanach"}), PL_MESKI_OS);
// Imie - nazwa npca i odmiana.   
    dodaj_przym(({"barczysty"}), ({"barczysci"}));             
// Barczysty mezczyzna - tak bedzie wygladal dla tych, ktorym sie jeszcze
// nie przedstawil.
    set_long("Ten potezny mezczyzna wyglada jak prawdziwy wilk morski. "
      + "Muskularne barki i ramiona znamionuja niebywala sile, gesta "
      + "broda i przenikliwy wzrok wskazuja na doswiadczenie, a ogorzala "
      + "i wysmagana niejednym wichrem twarz dowodzi, ze czlowiek ten "
      + "wiele razy w swym zyciu zmagal sie z morskim zywiolem. "
      + "Pomimo, ze co chwila raczy sie ulubionym trunkiem marynarzy, "
      + "z jego gestow mozna wywnioskowac, iz cos go powaznie trapi. "
      + "\n");
// Piekny, dlugi opis.                
    ustaw_odmiane_rasy(PL_MEZCZYZNA); 
    set_gender(G_MALE);
// Plec i odmiana rasy.        
    set_stats(({65, 54, 70, 35, 35, 70}));
// Jego cechy.        
    set_skill(SS_DEFENCE, 20 + random(5));
    set_skill(SS_UNARM_COMBAT, 20 + random(5));
    set_skill(SS_SWIM, 25);
    set_skill(SS_PARRY, 15 + random(4));
    set_skill(SS_WEP_CLUB, 20 + random (8));
// Zdolnosci ktore posiada. Jak widac niektore losowe.        
    add_prop(CONT_I_WEIGHT, 95000);
    add_prop(CONT_I_HEIGHT, 185);
// Waga i wysokosc naszego bohatera.        
    add_ask(({"pomoc","zadanie","prace"}), VBFC_ME("quest_hint"));
    add_ask(({"amulet", "talizman"}), VBFC_ME("amulet_hint"));
    add_ask(({"dziewczyne", "panienke"}), VBFC_ME("dziew_hint"));
// Gdy nasz npc bedzie zapytany o konkretna rzecz dotyczaca questa,
// uruchomione beda funkcje jak wyzej.
    set_default_answer(QCIMIE(TO,PL_MIA) + " odpowiada: Niestety " +
        "nie jestem w stanie ci w tym pomoc.\n");
// Jesli gracz spyta go o cos innego, dostanie taka odpowiedz.
    set_act_time(3);
    add_act("emote mowi: Co ja teraz ze soba zrobie ??? "); 
    add_act("emote pyta: Chyba bede musial ja odnalezc, tylko jak ?");
    add_act("emote obiecuje: Ooo, juz wiecej nie dam sie nabrac na kobiece wdzieki!");
    add_act("emote pyta sam siebie: Jak ja moglem jej zaufac ?");
    add_act("emote wzdycha smutno.");
    add_act("emote rozglada sie bezradnie dookola. ");
    add_act("emote w zamysleniu drapie sie w brode.");
    add_act("emote popija piwo, wyraznie strapiony.");
    add_act("emote mamrocze pod nosem jakies przeklenstwa.");
// Losowe emoty npca.        
remove_prop(NPC_M_NO_ACCEPT_GIVE);
// Musimy usunac tego propa bo inaczej gracz nic nie bedzie mogl mu dac. 
}       

void
add_introduced(string imie)
{
    set_alarm(2.0,0.0,"return_intro", imie);
}

varargs void 
return_intro(string kto)
{
    /* Przedstawia sie tylko graczom - w ten sposob unikamy zapetlenia. */

    command("przedstaw sie " + find_player(kto)->query_real_name(PL_CEL));
}
// Dwie powyzsze funkcje pozwalaja naszemu npcowi przedstawiac sie grzecznie
// gdy ktos mu sie przedstawi.
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 Gdzie ten szczur ladowy polazl!");
        command("splun"); 
        zajety = 0;
        return "";
    }
// To bylo jesli gracz juz sobie poszedl.
    switch(faza)
    {
        case 0:    if(zajety)
		   {
		     command("powiedz Chwileczke, daj mi skonczyc.");
		     return"";
		   }
	// Sprawdzamy czy ktos juz z nim wlasnie gada - jesli tak nie bedziemy 
		// mnozyc tekstu
        
                /* Zaczyna gadac. Sprawdzamy, czy gracz zrobil questa, itd. */
                /* Zapamietujemy gracza w zmiennej, bo w alarmach this_player()
		 * nie dziala
		 */
                gracz = this_player();
            if (gracz->test_bit("imperium", 0, 3))
// Sprawdzamy czy gracz ma juz zrobiony quest, to znaczy czy ma ustawiony
// 'bit' tego questa jako aktywny. Jesli tak to:
            {
                command("emote prez chwile drapie sie w brode w zamysleniu.");
                command("emote mowi: Dziekuje ci za checi, ale pomogles mi "
                  + "juz wystarczajaco, nic wiecej nie potrzebuje.");
                command("emote usmiecha sie przyjaznie. "); 
                return "";
                /* Wyjscie z funkcji */
            }
            
            if (gracz->query_prop(PLAYER_I_DOSTAL_QUEST_HERMANA))
// Jesli gracz ma juz tego propa, to znaczy ze wysluchal juz tego, co
// Herman ma do powiedzenia.
            {
               command("powiedz Do diaska! Juz ci wszystko powiedzialem!");
               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;
// Zaczynamy gadke 
            command("emote usmiecha sie rozradowany. ");
            command("emote mowi: Do czorta ! Mysle, ze mozesz mi bardzo " +
                "pomoc !");

            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 1: /* kontunacja gadki */
            command("emote mowi: Potrzebny mi jest ktos sprytny, bo sprawa "
                + "jest dosc delikatna. ");
            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 2:
            command("emote wyjasnia: Widzisz, niedawno wrocilem z dlugiego "
                + "rejsu, wiec postanowilem sie zabawic z rozmachem ! "
                + "Kiedy juz sobie niezle popilem, wziela sie "
                + "za mnie jedna z tutejszych panienek, no wiesz...");
            command("emote mruga znaczaco jednym okiem.");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 3:
            command("emote mowi: Noc byla upojna, a ona wydawala mi sie byc "
                + "niczym najpiekniejsza fregata. Przez chwile nawet myslalem "
                + ", czy sie z nia nie ozenic...");
            command("emote wybucha nagle glosnym, rubasznym smiechem"
                + " i rownie niespodziewanie milknie. ");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 4:
            command("emote mowi: Kiedy sie obudzilem, jej juz nie bylo, a "
                + "wraz z nia zniknal moj amulet i wszystkie moje pieniadze.");
            set_alarm(5.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 5:
            command("emote grzmi: Do diabla z pieniedzmi! Byla tego warta! "
                + " Ale ja musze odzyskac moj amulet, rozumiesz? Musze!"
                + " Na wszystkie demony Chaosu! Bez niego nie postawie "
                + "swojej nogi na zadnej lajbie!! ");
            set_alarm(7.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 6:
            command("emote mowi: Przynies mi go, a postawie ci najlepsze piwo "
                + "w tej karczmie! ");
            set_alarm(2.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 7:
            command("emote usmiecha sie z iskierka nadziei w oku. ");
            gracz->add_prop(PLAYER_I_DOSTAL_QUEST_HERMANA, 1); 
                      /* zaznaczamy sobie, ze gracz   */
                      /* uslyszal to co trzeba        */
            zajety = 0;
            // Odblokowujemy pana
            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
amulet_hint(int faza)
{
// Kolejne podpowiedzi.
    switch(faza)
    {
     case 0:
   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
// Sprawdzamy czy ktos juz z nim wlasnie gada - jesli tak nie bedziemy 
// mnozyc tekstu
   zajety = 1;
    
       command("emote pochyla sie nad stolem i zaczyna szeptac: " +
        "Jest to kawalek zeba Lewiatana, ktorego pokonal moj ojciec " +
        "w czasie wyprawy do Norski. Podobno to byl straszny potwor...");
      set_alarm(4.0,0.0, "amulet_hint", (faza + 1));
      break;

     case 1:
       command("emote mowi:Ten zab staruszek kazal potem oprawic "+
        "w zloto, nosilem go " + 
        "zawsze na szyi. To jedyna pamiatka jaka mam po nim....");
      set_alarm(7.0,0.0, "amulet_hint", (faza + 1));
      break;

     case 2:
       command("emote wspomina: Moj staruszek wyplynal wkrotce " +
        "na morze i sluch po nim zaginal. Ludzie mowia, ze to byla " +
        "zemsta tego Lewiatana, ale ja im nie wierze !");
      set_alarm(7.0,0.0, "amulet_hint", (faza + 1));
      break;


     case 3:
       command("emote dodaje: Od tej pory amulet broni mnie przed " +
        "roznego rodzaju przygodami, czasami wydaje mi sie, ze " +
        "przemawia przez niego moj ojciec, udzielajac mi w pore " +
        "wlasciwych porad!");
      set_alarm(7.0,0.0, "amulet_hint", (faza + 1));
      break;

     case 4:
       command("emote wbija w stol swoj wzrok: Musisz mi pomoc" +
        " go odnalezc, nie wroce bez niego na morze, a bez morza " +
        "nie potrafie zyc !");
      zajety = 0;
      break;

    }
    return"";
}

varargs string
dziew_hint(int faza)
{
    switch(faza)
    {
     
     case 0:
   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
// Sprawdzamy czy ktos juz z nim wlasnie gada - jesli tak nie bedziemy 
// mnozyc tekstu
   zajety = 1;
        
        command("emote mowi: Pamietam wszystko jak przez mgle, " +
        "bylem wtedy niezle wstawiony wiec nie zwracalem wiekszej "+
        "uwagi na szczegoly ! ");
        command("emote wali ze smiechem reka w stol i dodaje: " +
        ".....ale moze cos " +
        "sobie przypomne. Zaraz niech no chwile pomysle !");
      set_alarm(4.0,0.0, "dziew_hint", (faza +1));
      break;

     case 1:
  
       command("emote zastanawia sie przez chwile.");
      set_alarm(7.0,0.0, "dziew_hint", (faza +1));
      break;

     case 2:

       command("emote mowi: Nazywala sie chyba Katrina, albo Karina " +
        "przynajmniej tak mi sie przedstawila. Miala niezwykle " +
        "piekna twarz, prawie elfiej urody i bardzo dlugie, " +
        "krecone czarne wlosy. Echhh, co to byla za dziewka....!");
      set_alarm(7.0,0.0, "dziew_hint", (faza +1));
      break;

     case 3:

       command("emote dodaje po chwili namyslu: Wydaje mi sie, " +
        "ze zauwazylem jakies dziwne znamie na jej dloni, cos " +
      "na ksztalt wypalonego trojzebu, czy halabardy. Widzialem " +
      "to tylko przez chwile, zaraz potem zacisnela dlon, a mnie " +
      "w glowie byly inne rzeczy niz zadawanie pytan, he, he, he !");
      set_alarm(7.0,0.0, "dziew_hint", (faza +1));
      break;

     case 4:

       command("emote konczy: Nie mam pojecia czy ci to " +
        "pomoze w poszukiwaniach, moze to byl jej znak " +
        "gildiowy, albo co ? Nie mam pojecia co on moze " +
        "oznaczac, popytaj sie moze ktos bedzie wiedzial.");
       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(ob->id("_amulet_hermana_"))
// 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_medalion(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)
{
// Ta funkcja jest wywolywana, gdy ktos da Hermanowi przedmiot, ktory
// nie jest amuletem.
    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: Nie chce niczego innego poza moim " +
        "amuletem.");
    command("emote dodaje: Wez to z powrotem, prosze. ");
    command("daj " + ob->query_nazwa(3) + " " + from->query_nazwa(2));
// Herman oddaje to co nie jest mu potrzebne.
} 

void
oddal_medalion(object from)
{
// Ta funkcja jest wywolywana gdy ktos odda Hermanowi poszukiwany
// przez niego medalion.
   string who,
   what;
   
   who = from->query_real_name();
// Imie gracza mala litera.   
   if (!from->query_prop(PLAYER_I_DOSTAL_QUEST_HERMANA))
   {
      command("emote mowi: Do czorta! Brawo! Skad wiedziales ze mi go ukradli ?"); 
      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 krzyczy: Moj amulet! Znalazles go! Jestem ocalony!");
   ile_doswiadczenia(from);
// Wywolanie funkcji dajacej doswiadczenie.   
   command("emote zadowolony wybiega z baru.");
   remove_object();
// Herman znika.   
}

void
ile_doswiadczenia(object who)
{
// Funkcja uruchamiana, gdy gracz dostarczyl Hermanowi poszukiwany 
// medalion.
   int xp_base = 5000;
// Podstawa expow za danego questa.   
   if (who->test_bit("imperium", 0, 3))
   {
// Jesli gracz robil juz tego questa, to nie moze dostac expow po raz
// drugi.
      who->catch_msg("To milo, ze mi pomogles raz jeszcze.\n");
      return;
   }
   
   xp_base -= (who->query_prop(PLAYER_I_ZNALAZL_DZIEWCZYNE) ? 0 : 2000);
   xp_base -= (who->query_prop(PLAYER_I_ROZMAWIAL_Z_MAMA)   ? 0 : 2000); 
// Od calkowitej puli punktow za quest odejmowane jest po 2000 jesli gracz
// nie ma odpowiednich propow, czyli nie przeszedl questa calego tak, jak
// powinien, moze robil go z opisu, moze mu sie przyfarcilo, jednakze nie
// powinien dostac 5000 tylko odpowiednio mniej.
   who->catch_msg("Czujesz sie bardziej doswiadczony.\n");
   who->add_exp(xp_base, 0);
// Dodajemy graczowi tyle punktow doswiadczenia ( questowych ), ile 
// wyszlo z powyzszych obliczen.
   who->set_bit(0, 3);
// Ustawiamy graczowi bit tego questa jako aktywny - to jest zachowane
// w pliku gracza - nie bedzie juz mogl po raz drugi tego questa zrobic.
// Bity questowe przyznawane sa przez lorda na prosbe wiza kodujacego
// quest.
   seteuid("silvy");
   write_file("/d/Imperium/private/questlog/przykladowy.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;
}

string
query_presentation()
{
    return"Herman Van Der Broot, Starszy Bosman, czlowiek";
}    
// Nowy tytul Hermana.
