
//  Chory staruszek. Questowy NPC.
      

inherit "/d/Imperium/std/monster.c";
#include "silvy.h"

#define PLAYER_I_DOSTAL_QUEST_CODANA  "_player_i_dostal_quest_codana"
#define PLAYER_I_ZNALAZL_ZIELSKO  "_player_i_znalazl_zielsko"
#define PLAYER_I_BYL_U_APTEKARZA  "_player_i_byl_u_aptekarza"

object gracz;
int zajety;

void ile_doswiadczenia(object who);
void oddaj_rzecz(object ob, object from);
void oddal_lek(object from);

void
create_monster()
{
// Standardowa funkcja npca.
    ustaw_imie(({"codan","codana","codanowi","codana","codanem","codanie"}),
        PL_MESKI_OS);
    
    dodaj_nazwy(({"staruszek","staruszka","staruszkowi","staruszka","staruszkiem",
      "staruszku"}), ({"staruszkowie","staruszkow","staruszkom","staruszkow",
      "staruszkami","staruszkach"}), PL_MESKI_OS);
    
// Imie - nazwa npca i odmiana.   
    dodaj_przym("przygarbiony","przygarbieni");             

    set_long("Stary czlowiek stoi w ciemnym zaulku. Ma dlugie, siwe wlosy i tego samego koloru brode. " +
             "Jego twarz jest poznaczona bruzdami starosci. Jest w zlym stanie, wyglada na chorego. " +
             "Kaszle i co chwile lapie sie za gardlo. Pluje krwia, krzyczy cos niewyraznie. " +
             "Moze mozna mu jakos pomoc...?\n");
    ustaw_odmiane_rasy(PL_CZLOWIEK); 
    set_gender(G_MALE);

    set_stats(({35, 30, 33, 27, 27, 33}));

    set_skill(SS_DEFENCE, 5 + random(5));
    set_skill(SS_UNARM_COMBAT, 5 + random(5));
    set_skill(SS_PARRY, 12 + random(4));
    set_skill(SS_WEP_KNIFE, 10 + random (8));

    add_prop(CONT_I_WEIGHT, 62000);
    add_prop(CONT_I_HEIGHT, 172);

    add_ask(({"pomoc",}), VBFC_ME("quest_hint"));
    add_ask(({"lek", "lekarstwo"}), VBFC_ME("lek_hint"));
    add_ask(({"aptekarza", "lekarza", "doktora"}), VBFC_ME("aptekarz_hint"));

    set_default_answer(QCIMIE(TO,PL_MIA) + " odpowiada: Nic o tym nie wiem...\n");

    set_chat_time(26);
    add_chat("Moje gardlo!"); 
    add_chat("Dusze sie! Khkkk...");
    add_chat("Moj lek... Moje lekarstwo...");
    add_chat("Moja smierc nadchodzi. Moze ona przyniesie ulge.");

    set_act_time(15);
    add_act("emote bierze gleboki, urwany oddech, po czym zanosi sie kaszlem.");
    add_act("emote spluwa krwia.");
    add_act("emote lapie sie za gardlo.");
    add_act("emote mamrocze jakies niezrozumiale, urywane slowa.");
    add_act("emote pada na ziemie w ataku kaszlu. Po chwili podnosi sie z trudem.");


    remove_prop(NPC_M_NO_ACCEPT_GIVE);
}       

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 */
{

/* Wpierw zapamietujemy gracza w zmiennej, bo w alarmach this_player()
 * nie dziala
 */

    
/* Za kazdym razem, gdy ma powiedziec jakas kwestie, sprawdzamy, czy gracz
 * jeszcze go slucha ... :-)
 */
    if (faza)
    if (!present(gracz, environment(this_object())))
    {
        command("powiedz Zostawil mnie bez pomocy... Lajdak.");
        command("emote kaszle chrapliwie i osuwa sie na ziemie."); 
        zajety=0;
        return "";
    }
// To bylo jesli gracz juz sobie poszedl.
    switch(faza)
    {
        case 0: 
             if(zajety)
               {
                 command("powiedz Chwileczke, daj mi skonczyc.");
                 return"";
               }
            gracz = this_player();
          /* Zaczyna gadac. Sprawdzamy, czy gracz zrobil questa, itd. */
            if (gracz->test_bit("imperium", 0, 12))
// Sprawdzamy czy gracz ma juz zrobiony quest, to znaczy czy ma ustawiony
// 'bit' tego questa jako aktywny. Jesli tak to:
            {
                command("namysl sie");
                command("emote mowi: Dziekuje ci za dobre checi, ale pomogles mi "
                  + "juz wystarczajaco, niczego wiecej nie potrzebuje. Jeszcze raz dziekuje.");
                command("emote usmiecha sie przyjaznie."); 
                return "";
                /* Wyjscie z funkcji */
            }
            
            if (gracz->query_prop(PLAYER_I_DOSTAL_QUEST_CODANA))
// Jesli gracz ma juz tego propa, to znaczy ze wysluchal juz tego, co
// Herman ma do powiedzenia.
            {
               command("powiedz Powiedzialem wszystko, co wiem. Pospiesz sie, prosze!");
               command("emote oddycha ciezko."); 
               return "";
               /* Wyjscie z funkcji */
            }
// Jesli dwa 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 smutno. ");
            command("emote mowi: Dziekuje bardzo, mozesz mi pomoc w jeden sposob."); 

            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 1: /* kontunacja gadki */
            command("emote mowi: Jak widzisz, moje zdrowie jest na wyczerpaniu i bardzo mozliwe, " +
                   "ze umre, jezeli nie dostane mojego leku.");
            set_alarm(3.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 2:
            command("emote wyjasnia: Ten lek moze przyrzadzic tylko jedna osoba, moj znajomy lekarz. " +
                    "Z tego, co wiem uzywal do tego jakichs dziwnych lisci. Moze nawet magicznych... " +
                    "Niewazne. Zawsze pomagalo. Ale moj zapas sie skonczyl, a ja nie mam sily, zeby dojsc " +
                    "do zielarza.");

            command("emote wzdycha smutno.");
            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 3:
            command("emote mowi: Poza tym nie mam juz pieniedzy, aby zaplacic" +
                    " za lekarstwo. Jestem skazany na pewna smierc... ");
            command("emote spuszcza glowe i pada na kolana.");
            set_alarm(3.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 4:
            command("emote podnosi na ciebie wzrok i nagle w jego oczach widac lekki blysk nadziei.");
            command("emote mowi: Prosze, pomoz mi! Jestem zruinowany i nie moge niczego ci dac w zamian "+
                    "ale spojrz na mnie. Nie chce jeszcze umierac. Prosze, pomoz mi. Pomoz mi... ");
            command("emote patrzy na ciebie blagalnym wzrokiem.");
            set_alarm(3.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 5:
            command("emote mowi blagalnym glosem: Przynies mi lek, a bede ci wdzieczny do konca zycia. " +
                   "Wiem, ze to niewiele ale niczego wiecej poza tym i moim ubraniem nie moge zaoferowac...");
            set_alarm(4.0, 0.0, "quest_hint", (faza + 1));
            break;
        case 6:
            command("emote usmiecha sie z iskierka nadziei w oku. ");
            gracz->add_prop(PLAYER_I_DOSTAL_QUEST_CODANA, 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
lek_hint(int faza)
{
// Kolejne podpowiedzi.
    switch(faza)
    {
     case 0:
   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
   zajety = 1;
    
       command("emote mowi cicho: To bardzo nieprzyjemne w smaku i zapachu paskudztwo lecz bardzo skuteczne. " +
               "Z tego, co wiem tylko jedna osoba w calym Nuln potrafi go przyrzadzic.");
      set_alarm(4.0,0.0, "lek_hint", (faza + 1));
      break;

     case 1:
       command("emote mowi: Lek wiele razy ratowal mi zycie. Nie wiem tylko, z "  +
                "czego i jak sie go robi.");
      set_alarm(4.0,0.0, "lek_hint", (faza + 1));
      break;

     case 2:
       command("emote kaszle glosno. Po chwili mowi zachrypnietym glosem: " +
               "Musze szybko dostac lek. W przeciwnym razie zgine. ");
      set_alarm(3.0,0.0, "lek_hint", (faza + 1));
    zajety = 0;
      break;
    }
    return"";
}

varargs string
aptekarz_hint(int faza)
{
    switch(faza)
    {
     
     case 0:
   if(zajety)
   {
     command("powiedz Chwileczke, daj mi skonczyc.");
     return"";
   }
   zajety = 1;

        command("emote mowi: Aptekarz mieszka w miescie Nuln. Apteke poznasz po szyldzie wiszacym przed wejsciem.");
      set_alarm(3.0,0.0, "aptekarz_hint", (faza +1));
      break;

     case 1:
  
       command("emote zastanawia sie przez chwile glaszczac brode.");
      set_alarm(4.0,0.0, "aptekarz_hint", (faza +1));
      break;

     case 2:

       command("emote mowi: Aptekarzowi powiedz, ze rozlicze sie z nim pozniej. On juz zna starego Codana. " +
               "Pospiesz sie, prosze. Moje pluca dlugo nie wytrzymaja...");
    zajety = 0;
      break;

    }
    return"";
}

void
enter_inv(object ob, object from)
{
   ::enter_inv(ob, from);
   if(ob->id("_lek_codana_"))
   {
       set_alarm(1.0, 0.0, &oddal_lek(from));
       return;
   }
   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());
    who = from->query_real_name();
    command("emote kreci glowa z dezaprobata.");
    command("emote kaszle chrapliwie.");
    command("emote mowi: Nie chce niczego oprocz leku. Tylko on mi moze pomoc.");
    command("emote dodaje: Wez to z powrotem, prosze.");
    command("daj " + ob->query_nazwa(3) + " " + from->query_nazwa(2));
} 

void
oddal_lek(object from)
{
   if (!from->query_prop(PLAYER_I_DOSTAL_QUEST_CODANA))
   {
      command("emote mowi: Och! To moj lek! Bede zyl! Ale... Skad wiedziales, ze jest mi potrzebny?"); 
      return;
   }
   command("emote krzyczy: Lek! Moj lek! Dziekuje ci! Jestem ocalony. Bede zyl...");
   ile_doswiadczenia(from);
   command("emote szybko wypija miksture i znika za rogiem.");
   remove_object();
}

void
ile_doswiadczenia(object who)
{
   int xp_base = 50000;
   if (who->test_bit("imperium", 0, 12))
   {
      who->catch_msg("To bardzo milo, ze mi pomogles raz jeszcze.\n");
      return;
   }
   
   who->catch_msg("Czujesz sie troche bardziej doswiadczon" +
   	who->koncowka("y","a") + ".\n");
   who->add_exp(xp_base, 0);
   who->set_bit(0, 12);
   seteuid("silvy");
   write_file("/d/Imperium/private/questlog/0_12.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"Codan czlowiek";
}    

