inherit "/d/Imperium/std/monster";
#include "tigr.h"
#include <composite.h>
#include <money.h>

#define SECURE_MASTER "/secure/master"
#define PLIK_STANU TPATH + "/npc/gerhard"

#define ODP_GERHARDOWI "_imp_player_i_odpowiada_gerhardowi"
#define IMIONA ({"Alfred","Bohdan","Carlos","Didier","Edalbert","Franck",\
	"Gawryl","Hans","Ire","Jeck","Kiryl","Logan"})
#define CZWORKA czw
#define IMIONA_CZW COMPOSITE_WORDS(CZWORKA)


string *losuj_czworke();

object gracz=0;
int zajety=0;
mapping czas=([]);
int pochodnia=0,minuty=0;
string *czw=losuj_czworke();
string *tu=CZWORKA,*tam=({});

int
losuj_inta(int* nie_moga=0)
{
   int val;
   
   val=random(sizeof(IMIONA));
   if (sizeof(nie_moga)&&member_array(val,nie_moga)>-1)
      return losuj_inta(nie_moga);
   return val;
}

string *
losuj_czworke()
{
   int a,b,c,d;
   string *im;
   
   a=losuj_inta();
   b=losuj_inta(({a}));
   c=losuj_inta(({a,b}));
   d=losuj_inta(({a,b,c}));
   
   return im=({IMIONA[a],IMIONA[b],IMIONA[c],IMIONA[d]});
}

check_mapping()
{
   mixed imiona;
   int i;
   
   imiona = m_indexes(czas);
   
   for (i=0;i<sizeof(imiona);i++)
       {
          if (stringp(imiona[i]))
             if (!(SECURE_MASTER->exist_player(imiona[i])))
                czas = m_delete(czas,imiona[i]);
       }
}

ustaw_default_values()
{
   pochodnia=0;
   tu=CZWORKA;
   tam=({});
   minuty = 0;
}

create_monster()
{
   ustaw_imie( ({"gerhard","gerharda","gerhardowi","gerharda",
   		 "gerhardem","gerharda"}),
   		PL_MESKI_OS);
   		
   set_long("Ten wysoki mlody czlowiek ubrany jest w dosc popolite " + 
   	"odzienie. Ma on ciemne wlosy, a z jego twarzy patrzy na ciebie " +
   	"para szarych oczu. Wszystko w jego wygladzie i ruchach mowia ci " +
   	"o jego wiejskim pochodzeniu.\n");
   
   dodaj_przym("wysoki","wysocy");
   dodaj_przym("mlody","mlodzi");
   
   set_gender(G_MALE);
   ustaw_odmiane_rasy(PL_CZLOWIEK);
   
   set_stats( ({80,70,80,50,50,70}) );
   
   set_default_answer(QCIMIE(TO,PL_MIA)+ " odpowiada: Nie wiem, o czym mowisz.\n");
   
   add_ask( ({"zagadke","zadanie","pomoc"}),VBFC_ME("quest_hint"));
   add_ask( ({"sytuacje"}),VBFC_ME("sytuacja_hint"));
   
   set_skill(SS_UNARM_COMBAT, 80);
   set_skill(SS_DEFENCE, 80);
   
   set_act_time(20);
   add_act("emote wzdycha przeciagle.");
   add_act("emote mowi: Nie potrafie tego rozwiazac!");
   add_act("emote mowi: Ta zagadka nie ma rozwiazania!");
   add_act("emote mowi: Nie moge znalezc odpowiedzi.");
   add_act("emote patrzy tepo przed siebie.");
   
   restore_object(PLIK_STANU);
   check_mapping();
   czw=losuj_czworke();
   ustaw_default_values();
   
   set_ghost(0);
   save_object(PLIK_STANU);
   
}


string query_presentation()
{
   return "Gerhard Krup, czlowiek";
}

return_intro(object kto)
{
   
   if (kto)
      {
         if (!CAN_SEE(TO, kto)) 
            {
              command("rozejrzyj sie");
              return;
            }
         command("'Witaj, " + kto->query_wolacz() + "!");
         command("przedstaw sie " + OB_NAME(kto));
         command("'Moze ty mi pomozesz z ta zagadka?");
      }
}

add_introduced(string kto)
{
   set_alarm(1.0,0.0,&return_intro(find_player(kto)));
}

string
quest_hint(int faza)
{
   if (faza)
      if (!present(gracz, environment(TO)))
         {
             command("powiedz Eech, i on pewnie nie rozwiaze tej zagadki.");
             command("westchnij");
             zajety = 0;
             return "";
         }
      
   switch(faza)
      {
         case 0: if (zajety)
                    {
                      if (gracz==TP) set_alarm(3.0,0.0,&quest_hint(7));
                      else 
                         command("powiedz Rozmawiam z innym!");
                      return "";
                    }
                 gracz = TP;
                 if (gracz->test_bit("imperium",1,2))
                    {
                       command("powiedz Pomogles mi juz, dzieki!");
                       return "";
                    }
                 if (czas[gracz->query_real_name()])
                    {
                       command("powiedz Przeciez juz ci mowilem!");
                       command("powiedz Ale niech tam, powtorze raz jeszcze.");
                       zajety = 1;
                       set_alarm(3.0,0.0,&quest_hint(7));
                    }
                 else
                   {
                      command("powiedz Opowiem ci moje zmartwienie.");
                      zajety = 1;
                      set_alarm(4.0,0.0,&quest_hint(1));
                   }
                 return "";
         case 1: 
                 command("powiedz Najpierw moja historia...");
                 command("emote zamysla sie na chwile.");
                 set_alarm(2.0,0.0,&quest_hint(2));
                 return "";
         case 2:
                 command("powiedz Tak sie stalo, zem zakochal sie.");
                 command("usmiech");
                 command("powiedz Anna jest corka mlynarza z sasiedniej wsi.");
                 set_alarm(4.0,0.0,&quest_hint(3));
                 return "";
         case 3:
                 command("powiedz Od przeszlo polroku spotykamy sie.");
                 command("powiedz I pewnym, ze kocha mnie tak, jak ja ja kocham!");
                 command("emote usmiecha sie bezwiednie.");
                 command("powiedz Dlatego tez udalem sie do jej ojca, " +
                 	"aby prosic o jej reke!");
                 command("emote patrzy przed siebie zastanawiajac sie.");
                 set_alarm(8.0,0.0,&quest_hint(4));
                 return "";
         case 4:
                 command("powiedz Bylo to pare dni temu.");
                 command("powiedz Mlynarz przyjal mnie serdecznie...");
                 command("powiedz lecz gdy przedstawilem mu swa prosbe...");
                 command("powiedz powiedzial...");
                 set_alarm(6.0,0.0,&quest_hint(5));
                 return "";
         case 5:
                 command("powiedz 'Musze sie przekonac, zes odpowiednia para " +
                 	"dla corki mej.'");
                 command("powiedz 'Widze, ze sila i wzrostem bogowie dobrze " +
                 	"cie obdarzyli...'");
                 command("powiedz 'Chce wiec madrosc i rozum twoj sprawdzic.'");
                 command("powiedz 'Zagadke ci zadam, a jak ja rozwiazesz, wtedy " +
                 	"dyskusje kontynuowac bedziemy.'");
                 command("emote umilka na kilka chwil.");
                 set_alarm(9.0,0.0,&quest_hint(6));
                 return "";
         case 6:
                 command("powiedz Powiedzial mi ta zagadke i pozegnalismy sie...");
                 command("powiedz Trzeci dzien juz siedze nad nia, lecz zupelnie " +
                 	"rozwiazac jej nie moge.");
                 command("powiedz Pomoz mi ja rozwiazac!");
                 command("popatrz blagalnie na " + OB_NAME(gracz));
                 set_alarm(8.0,0.0,&quest_hint(7));
                 return "";
         case 7:
                 command("powiedz Oto zagadka:");
                 command("powiedz Czterech najemnikow: " + IMIONA_CZW +
                 	" zbyt dlugo zabawili sie w karczmie i zostalo im " +
                 	"17 minut, zeby wrocic do obozu na drugiej stronie rzeki.");
         case 8: command("powiedz Most jest skonstruowany tak, ze naraz moga isc tylko dwie osoby.");
         	 command("powiedz Jako ze zapadly ciemnosci, zeby przejsc przez most " +
         	 	"potrzebne jest zrodlo swiatlo.");
         	 command("powiedz Najemnicy maja tylko jedna pochodnie.");
         	 command("powiedz " + CZWORKA[2] + " i " + CZWORKA[3] + " sa " +
         	 	"nieco pijani i na pokonanie mostu potrzebuja odpowiednio 5 i 10 minut.");
         	 command("powiedz Bardziej trzezwi " + CZWORKA[0] + " i " + CZWORKA[1] + 
         	 	" potrzebuja na przeprawe odpowiednio 1 i 2 minuty.");
         	 command("powiedz Rzeka jest zbyt szeroka, by dalo sie przerzucic przez " +
         	 	"nia pochodnie.");
         	 command("powiedz Przeprowadz ich przez most, tak aby zdazyli do obozu.");
         
         	 set_alarm(15.0,0.0,&quest_hint(15));
         	 return "";
         case 15:
                 command("powiedz Tak wyglada zagadka...");
                 command("powiedz Jesli potrafisz znalezc rozwiazanie, " +
                 	"odpowiedz mi na nia.");
                 zajety = 0;
                 if (!czas[gracz->query_real_name()])
                    czas[gracz->query_real_name()]=time();
                 check_mapping();
                 save_object(PLIK_STANU);
                 return "";
      }
}
int
minutes(string str)
{
   switch(member_array(str,CZWORKA))
      {
         case 0: return 1;
         case 1: return 2;
         case 2: return 5;
         case 3: return 10;
         default: return 100;
      }
}

string
opis_minut(int ile)
{
   if (ile==1) return "minuta";
   if (ile<5) return "minuty";
   return "minut";
}

sytuacja_answ()
{
   if (TP->query_prop(ODP_GERHARDOWI))
      {
         if (sizeof(tu)==4)
            command("powiedz Wszyscy sa na tym brzegu.");
         else command("powiedz Na tym brzegu " +
              ((sizeof(tu)==1)?"jest":"sa") + " " +
              COMPOSITE_WORDS(tu) + ", na drugim zas " +
              ((sizeof(tam)==1)?"jest":"sa") + " " +
              COMPOSITE_WORDS(tam) + ".");
         if (17-minuty)
            command("powiedz Zostalo " + (17-minuty) + " " + opis_minut(17-minuty) + ".");
         command("powiedz Pochodnia jest po " +
              (pochodnia?"tamtej":"tej") + " stronie.");
      }
}

string
sytuacja_hint()
{
   if (TP==gracz&&zajety&&TP->query_prop(ODP_GERHARDOWI))
      sytuacja_answ();
   else 
      command("emote odpowiada: Nie wiem, o czym mowisz.");
   return "";
}


przenies(string *str)
{
   int i;
   for(i=0;i<sizeof(str);i++)
      {
         if (tu_tam(str[i]))
            {
               tam=tam-({str[i]});
               tu=tu+({str[i]});
            }
         else
            {
               tu=tu-({str[i]});
	       tam=tam+({str[i]});
            }
      }
}

string* co_jest_w_stringu(string str)
{
   mixed expl;
   
   expl = explode(str," i ");
   
   return expl;
}

int
tu_tam(string str)
{
   if (member_array(str,tu)+1) return 0;
   return 1;
}

ile_doswiadczenia(object kto)
{
   int xp_base=1000;
   
   if (kto->test_bit("imperium",1,2))
      {
         command("powiedz Dzieki za pomoc.");
         return;
      }
   
   if ((time()-czas[kto->query_real_name()])<120||
        ((kto->query_prop(ODP_GERHARDOWI))-czas[kto->query_real_name()])<30)
      {
         xp_base=xp_base-500;
      }
   command("powiedz Dziekuje ci z calego serca!");
   MONEY_MAKE_GC(5)->move(TO,1);
   command("daj 5 zlotych monet " + OB_NAME(kto));
   
   kto->catch_msg("Czujesz sie bardziej doswiadczon" +
   	kto->koncowka("y","a") + ".\n");
   kto->add_exp(xp_base,0);
   kto->set_bit(1 , 2);
   
   seteuid("silvy");
   write_file("/d/Imperium/private/questlog/1_2.log",ctime(time()) + " : "
    + kto->query_name() + " " + xp_base + " xp\n");
   
   czas = m_delete(czas,kto->query_real_name());
   check_mapping();
   save_object(PLIK_STANU);
   
   command("emote wybiega z karczmy.");
   remove_object();
}

int
sprawdz(string *str)
{
   int i,ile_min;
   
   if (!sizeof(str)) return 0;
   
   for (i=0;i<sizeof(str);i++)
      {
         if (member_array(capitalize(str[i]),CZWORKA)==-1) return 0;
         str[i]=capitalize(str[i]);
      }
   if (sizeof(str)>2) 
      {
         command("powiedz Na raz moze isc tylko dwoch!");
         return 0;
      }
   ile_min=minutes(str[0]);
   if (sizeof(str)==2)
      {
         if (tu_tam(str[0])!=tu_tam(str[1])) 
            {
               command("powiedz Przeciez " + COMPOSITE_WORDS(str) + " nie " +
               		"sa na tym samym brzegu!");
               return 0;
            }
         ile_min=max(ile_min,minutes(str[1]));
      }
   if (tu_tam(str[0])!=pochodnia) 
      {
         command("powiedz Przeciez " + COMPOSITE_WORDS(str) + " nie " +
         	  "ma" + ((sizeof(str)==1)?"":"ja")+ " pochodni!");
         return 0;
      }
   if (ile_min+minuty>17) 
      {
         command("powiedz Nie udalo ci sie ulozyc w 17 minut.");
         return 0;
      }
   
   minuty=minuty+ile_min;
   przenies(str);
   pochodnia=(!pochodnia);
   if (sizeof(tam)==4)
      {
         command("powiedz Brawo!!! Udalo ci sie rozwiazac zagadke!");
         gracz->remove_prop(ODP_GERHARDOWI);
         ile_doswiadczenia(gracz);
         zajety=0;
         return 0;
      }
   if (!(17-minuty)) 
      {
         command("powiedz 17 minut skonczylo sie, zas na tym brzegu zostal" +
         ( (sizeof(tu)==1)?"":"i") + " " + COMPOSITE_WORDS(tu) + ".");
         command("powiedz Pewnie trzeba zaczac od nowa...");
         ustaw_default_values();
         return 0;
      }
   command("powiedz Teraz sytuacja wyglada nastepujaco:");
   sytuacja_answ();
   return 1;
}

chce_odpowiedziec(object kto)
{
   if (!CAN_SEE(TO, kto)) 
      {
         command("rozejrzyj sie");
         return;
      }
   if (zajety&&gracz!=kto)
      {
        command("powiedz Rozmawiam z innym.");
        return;
      }
   if (czas[kto->query_real_name()])
      {
         ustaw_default_values();
         if (kto->query_prop(ODP_GERHARDOWI))
            {
               command("powiedz Chcesz zaczac od poczatku?");
               command("powiedz Dobrze.");
            }
         else
            {
               command("powiedz A wiec znalazles rozwiazanie?");
               command("powiedz Powiedz mi, jakie ono jest!");
               command("popatrz z nadzieja na " + OB_NAME(kto));
            }
         kto->add_prop(ODP_GERHARDOWI,time());
         zajety=1;
         gracz=kto;
         command("powiedz do " + OB_NAME(kto) + 
           " Kto z nich ma przejsc pierwszy?");
      }
   else command("powiedz do " + OB_NAME(kto) + 
     " Przeciez nic do ciebie nie mowilem!");
}

mowi(object kto, string co)
{
   string *ida;
   
   if (!kto->query_prop(ODP_GERHARDOWI)) return;
   
   if (!CAN_SEE(TO,TP)) 
      {
        command("rozejrzyj sie");
        return;
      }
   ida = co_jest_w_stringu(co);
   if (!sprawdz(ida)) return;
   
   if (pochodnia)
      {
         command("powiedz Kto wraca z pochodnia?");
         return;
      }
   else
      {
         command("powiedz Kto idzie tym razem?");
         return;
      }
}

remove_object()
{  
    zajety=0;
    check_mapping();
    save_object(PLIK_STANU);
    ::remove_object();
}

poszedl_sobie(object kto)
{
   zajety=0;
   ustaw_default_values();
   command("powiedz I nie skonczyl" + kto->koncowka("","a") + "...");
   command("westchnij");
}