/*
 * Flet Lesnych Elfow
 *  by Tanis
 */
 
inherit "/std/object";

#include "lelf.h"

#define LELFY_FLET_SUBLOC "_tanisowy_flet_lesnych_elfow_subloc"

#include "melodie.h"

int czy_na_szyi=0;
int czy_gra=0;

void dodawanie_soula();

void
sprawdz_renegatow()
{ 
       remove_adj("drewniany");
	   remove_adj("elfi");
	   remove_adj("zniszczony");
	   
	   remove_prop(OBJ_M_NO_DROP);
	   remove_prop(OBJ_M_NO_SELL);
	   remove_prop(OBJ_M_NO_GIVE);
	   
   if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
     {
	 
    add_prop(OBJ_M_NO_DROP,"Ten flet to ostatnia nic wiazaca cie z Lesnymi Elfami i nie mozesz go porzucic. Jesli jednak chcesz wyrzec sie swych korzeni, odnajdz Yandela i opusc gildie.\n"); 
    add_prop(OBJ_M_NO_SELL,"Ten flet to ostatnia nic wiazaca cie z Lesnymi Elfami i nie mozesz go sprzedac. Jesli jednak chcesz wyrzec sie swych korzeni, odnajdz Yandela i opusc gildie.\n");
    add_prop(OBJ_M_NO_GIVE,"Ten flet to ostatnia nic wiazaca cie z Lesnymi Elfami i nie mozesz go komus oddac. Jesli jednak chcesz wyrzec sie swych korzeni, odnajdz Yandela i opusc gildie.\n"); 	 

       dodaj_przym("zniszczony","zniszczeni");
	   dodaj_przym("drewniany","drewniani");
	 }
   else
     {
    add_prop(OBJ_M_NO_DROP,"Flet ten oznacza twa przynaleznosc do Lesnych Elfow "
       + "i nie moze zostac ot tak sobie porzucony!\n"); 
    add_prop(OBJ_M_NO_SELL,"Nie mozesz sprzedac fletu! Oznacza twa przynaleznosc do "
       + "Lesnych Elfow.\n");
    add_prop(OBJ_M_NO_GIVE,"Flet oznacza twa przynaleznosc do Lesnych Elfow. Nie mozesz "
       + "go nikomu oddac!\n"); 	
	   
	   dodaj_przym("drewniany","drewniani");
       dodaj_przym("elfi","elfi");
	 }
}

void
create_object()
{
    ustaw_nazwe( ({"flet","fletu","fletowi","flet","fletem","flecie"}),
                 ({"flety","fletow","fletom","flety","fletami","fletach"}), 
                  PL_MESKI_NOS_NZYW);
    
    set_long("@@long_desc");    
    
    add_prop(OBJ_I_WEIGHT,50);
    add_prop(OBJ_I_VOLUME,50);
    add_prop(OBJ_I_VALUE,200); 
    add_prop(OBJ_M_NO_STEAL,1);

    seteuid(getuid());
	
	set_alarm(0.9,0.0,"dodawanie_soula");
	
	set_alarm(1.0,0.0,"sprawdz_renegatow");
}

void
graj(int ktora,int etap)
{
 object kto;
 
 kto=environment(this_object());

 if(!czy_gra)
   {
     czy_gra=1;
     kto->catch_msg("Podnosisz swoj elfi flet do ust i zaczynasz grac ...\n");
     tell_room(environment(kto), QCIMIE(kto,PL_MIA) + " podnosi swoj elfi flet do ust i zaczyna grac ...\n",({kto}));
   }

 if(!environment(environment(this_object())))
   {
    czy_gra=0;
    return;
   }

 if(tablica_melodii[ktora][etap][4])
   {
      // Ponizsze rozroznia, czy opis grajacego jest na poczaku, czy w srodku zdania i zwraca go z duzej albo malej litery.
      if(tablica_melodii[ktora][etap][0]=="") tell_room(environment(kto),tablica_melodii[ktora][etap][0] + QCIMIE(kto,tablica_melodii[ktora][etap][3]) + tablica_melodii[ktora][etap][1]+"\n",({kto}));
      else tell_room(environment(kto),tablica_melodii[ktora][etap][0] + QIMIE(kto,tablica_melodii[ktora][etap][3]) + tablica_melodii[ktora][etap][1]+"\n",({kto}));
   }
 else tell_room(environment(kto),tablica_melodii[ktora][etap][0] + tablica_melodii[ktora][etap][1]+"\n",({kto}));
 kto->catch_msg(tablica_melodii[ktora][etap][2]+"\n");
 
 if(tablica_melodii[ktora][etap+1]==0)
   {
     czy_gra=0;
     	 if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
	 	 {
	      kto->catch_msg("Przestajesz grac i opuszczasz flet.\n");
	      tell_room(environment(kto),QCIMIE(kto,PL_MIA) + " przestaje grac i opuszcza flet.\n",({kto}));
	 	 }
	 	 else
	 	 {
	      kto->catch_msg("Przestajesz grac i opuszczasz flet.\n");
	      tell_room(environment(kto),QCIMIE(kto,PL_MIA) + " przestaje grac i opuszcza flet.\n",({kto}));
	 }
     return;
   }

 set_alarm(itof(tablica_melodii[ktora][etap+1]), 0.0, "graj", ktora, etap+2);
}

void
graj_dla_kogos(object dla_kogo,int ktora,int etap)
{
 object kto;
 
 kto=environment(this_object());

 if(!present(dla_kogo, environment(kto)))
    {
        czy_gra=0;
        kto->catch_msg("Nagle orientujesz sie, ze nie masz juz dla kogo grac... Opuszczasz wiec flet konczac gre.\n");
        tell_room(environment(kto),QCIMIE(kto,PL_MIA) + " nagle orientuje sie, ze nie ma juz dla kogo grac. Opuszcza wiec flet konczac gre.\n",({kto}));
        return;
    }


 if(!czy_gra)
   {
     czy_gra=1;
     kto->catch_msg("Podnosisz swoj elfi flet do ust i zaczynasz grac melodie specjalnie dla " + dla_kogo->query_imie(kto,PL_DOP) + "...\n");
     dla_kogo->catch_msg(kto->query_Imie(dla_kogo,PL_MIA) + " podnosi swoj elfi flet do ust i zaczyna grac melodie specjalnie dla ciebie!\n");
     tell_room(environment(kto), QCIMIE(kto,PL_MIA) + " podnosi swoj elfi flet do ust i zaczyna grac melodie specjalnie dla " + QIMIE(dla_kogo,PL_DOP) + "...\n",({kto,dla_kogo}));
   }

 if(!environment(environment(this_object())))
   {
    czy_gra=0;
    return;
   }

 if(tablica_melodii_dla_kogos[ktora][etap][7]==1)
   {
      // Ponizsze rozroznia, czy opis grajacego jest na poczaku, czy w srodku zdania i zwraca go z duzej albo malej litery.
      if(tablica_melodii_dla_kogos[ktora][etap][0]=="") tell_room(environment(kto),tablica_melodii_dla_kogos[ktora][etap][0] + QCIMIE(kto,tablica_melodii_dla_kogos[ktora][etap][6]) + tablica_melodii_dla_kogos[ktora][etap][1]+"\n",({kto,dla_kogo}));
      else tell_room(environment(kto),tablica_melodii_dla_kogos[ktora][etap][0] + QIMIE(kto,tablica_melodii_dla_kogos[ktora][etap][6]) + tablica_melodii_dla_kogos[ktora][etap][1]+"\n",({kto,dla_kogo}));
   }

 else if(tablica_melodii_dla_kogos[ktora][etap][7]==2)
   {
      // Ponizsze rozroznia, czy opis grajacego jest na poczaku, czy w srodku zdania i zwraca go z duzej albo malej litery.
      if(tablica_melodii_dla_kogos[ktora][etap][0]=="") tell_room(environment(kto),tablica_melodii_dla_kogos[ktora][etap][0] + QCIMIE(dla_kogo,tablica_melodii_dla_kogos[ktora][etap][6]) + tablica_melodii_dla_kogos[ktora][etap][1]+"\n",({kto,dla_kogo}));
      else tell_room(environment(kto),tablica_melodii_dla_kogos[ktora][etap][0] + QIMIE(dla_kogo,tablica_melodii_dla_kogos[ktora][etap][6]) + tablica_melodii_dla_kogos[ktora][etap][1]+"\n",({kto,dla_kogo}));
   }

 else tell_room(environment(kto),tablica_melodii_dla_kogos[ktora][etap][0] + tablica_melodii_dla_kogos[ktora][etap][1]+"\n",({kto,dla_kogo}));


 if(tablica_melodii_dla_kogos[ktora][etap][9])
   {
      // Ponizsze rozroznia, czy opis grajacego jest na poczaku, czy w srodku zdania i zwraca go z duzej albo malej litery.
      if(tablica_melodii_dla_kogos[ktora][etap][2]=="") dla_kogo->catch_msg(tablica_melodii_dla_kogos[ktora][etap][2] + kto->query_Imie(dla_kogo,tablica_melodii_dla_kogos[ktora][etap][8]) + tablica_melodii_dla_kogos[ktora][etap][3]+"\n");
      else dla_kogo->catch_msg(tablica_melodii_dla_kogos[ktora][etap][2] + kto->query_imie(dla_kogo,tablica_melodii_dla_kogos[ktora][etap][8]) + tablica_melodii_dla_kogos[ktora][etap][3]+"\n");
   }

 else dla_kogo->catch_msg(tablica_melodii_dla_kogos[ktora][etap][2] + tablica_melodii_dla_kogos[ktora][etap][3]+"\n");

 if(tablica_melodii_dla_kogos[ktora][etap][11])
   {
      // Ponizsze rozroznia, czy opis grajacego jest na poczaku, czy w srodku zdania i zwraca go z duzej albo malej litery.
      if(tablica_melodii_dla_kogos[ktora][etap][4]=="") kto->catch_msg(tablica_melodii_dla_kogos[ktora][etap][4] + dla_kogo->query_Imie(kto,tablica_melodii_dla_kogos[ktora][etap][10]) + tablica_melodii_dla_kogos[ktora][etap][5]+"\n");
      else kto->catch_msg(tablica_melodii_dla_kogos[ktora][etap][4] + dla_kogo->query_imie(kto,tablica_melodii_dla_kogos[ktora][etap][10]) + tablica_melodii_dla_kogos[ktora][etap][5]+"\n");
   }

 else kto->catch_msg(tablica_melodii_dla_kogos[ktora][etap][4] + tablica_melodii_dla_kogos[ktora][etap][5]+"\n");

 if(tablica_melodii_dla_kogos[ktora][etap+1]==0)
   {
     czy_gra=0;
	 if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
	 {
     kto->catch_msg("Przestajesz grac i opuszczasz flet.\n");
     tell_room(environment(kto),QCIMIE(kto,PL_MIA) + " przestaje grac i opuszcza flet.\n",({kto}));
	 }
	 else
	 {
     kto->catch_msg("Przestajesz grac i opuszczasz flet.\n");
     tell_room(environment(kto),QCIMIE(kto,PL_MIA) + " przestaje grac i opuszcza flet.\n",({kto}));
	 }
     return;
   }

 set_alarm(itof(tablica_melodii_dla_kogos[ktora][etap+1]), 0.0, "graj_dla_kogos", dla_kogo, ktora, etap+2);
}

int
ezagraj(string str)
{
    int a,b;

   object *tablica;
   string melodia;
   object *obiekty;
   object kto=this_player();

    if(czy_gra)
      {
         notify_fail("Nie mozesz grac dwoch rzeczy rownoczesnie !\n");
         return 0;
      }
    if(!str)
      {
         notify_fail("Co chcesz zagrac ? Jesli chcesz sie dowiedziec, jakie melodie mozesz "
               + "zagrac, wpisz 'epomoc melodie'.\n");
         return 0;
      }

    if(wildmatch("* dla *",str))
      {
         parse_command(str,environment(kto),"%s 'dla' %l:"+PL_DOP,melodia,tablica);

        obiekty=NORMAL_ACCESS(tablica,0,0);

        if(sizeof(obiekty)<1)
          {
            notify_fail("Dla kogo chcesz zagrac swoja melodie ??\n");
            return 0;
          }

     for(a=0;a<sizeof(tablica_melodii_dla_kogos);a=a+2)
        {
           for(b=0;b<sizeof(tablica_melodii_dla_kogos[a]);b++)
              {
                  if(tablica_melodii_dla_kogos[a][b]==melodia)
                    {
                       if(!czy_melodia_mozliwa(kto, obiekty[0], tablica_melodii_dla_kogos[a]))
                          {
                             return 1; // Funkcja czy_melodia_mozliwa() - robi juz za notify_fail...
                          }

                       graj_dla_kogos(obiekty[0],a+1,0);
                       return 1;
                    }
              }
        }
      }

    for(a=0;a<sizeof(tablica_melodii);a=a+2)
       {
           for(b=0;b<sizeof(tablica_melodii[a]);b++)
              {
                  if(tablica_melodii[a][b]==str)
                    {
                       graj(a+1,0);
                       return 1;
                    }
              }
       }

    notify_fail("Chyba nie umiesz zagrac nic takiego ...\n");
    return 0;
}

int
mow_po_elfiemu(string str)
{

 return find_object(SOUL)->do_command("epowiedz",str);
}


void
init()
{
    ::init();

    add_action("mow_po_elfiemu",".",2);
    add_action("ezagraj","ezagraj");
	
    add_action("zawies","zawies");
    add_action("zdejmij","zdejmij");
}

string
long_desc()
{
    string str;
	
	   if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
	     str="Jest to zniszczony, drewniany flet. Wyglada na dosc stary, lecz z pewnoscia dobry grajek nadal potrafilby wydobyc z niego wspaniale dzwieki. "
		 + "Z pewna trudnoscia udaje ci sie dostrzec misterne rzezbienia, z pewnoscia wykonane przez elfich rzemieslnikow. "
		 + "Sa one jednak podniszczone, choc kiedys byly duma posiadacza fletu i swiadczyly o przynaleznosci do Lesnych Elfow.\n";
	     str= "Jest to drewniany, misternie rzezbiony elfi flet. Przez specjalny otwor przeciagniety "
      + "jest skorzany, mocny rzemien, aby flet mozna bylo nosic na szyi. Jest bardzo lekki i doscy maly, "
      + "jednak masz wrazenie, ze da sie na nim zagrac najwspanialsze melodie swiata. Jego misterne rzezbienia "
      + "bez watpienia zostaly wykonane przez najlepszych elfich rzemieslnikow. Flet ten swiadczy o "
      + "przynaleznosci do Lesnych Elfow. Pomoc dotyczaca gildii uzyskasz wpisujac 'epomoc'.\n";
	  
	  return str;
}

public string
query_auto_load()
{
   return MASTER + ":";
}

int
czy_to_flet_lelfow()
{
    return 1;
}

void
enter_env(object dest, object old)
{
    set_alarm(1.0,0.0,"zawies","flet na szyi");
}

void
leave_env(object from, object to)
{
    this_player()->remove_subloc(LELFY_FLET_SUBLOC);

    ::leave_env(from, to);
}

string
show_subloc(string subloc, object on_obj, object for_obj)
{
    if (subloc != LELFY_FLET_SUBLOC) return "";

    if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
    {
	    if (for_obj == on_obj)
            return "Na szyi, na skorzanym rzemieniu, masz zawieszony zniszczony, drewniany flet.\n";
        return "Na " +on_obj->koncowka("jego","jej")+ " szyi, na skorzanym rzemieniu, wisi zniszczony, drewniany flet.\n";
	}
	else
	{
	    if (for_obj == on_obj)
            return "Na szyi, na skorzanym rzemieniu, masz zawieszony drewniany, elfi flet.\n";
        return "Na " +on_obj->koncowka("jego","jej")+ " szyi, na skorzanym rzemieniu, wisi drewniany, elfi flet.\n";
	}

}

int
zawies(string str)
{
  if(str!="flet na szyi")
    {
     notify_fail("Co chcesz zawiesic ? Flet na szyi ?\n");
     return 0;
    }
  if(czy_na_szyi)
    {
      notify_fail("Przeciez juz powiesiles flet na swej szyi !\n");
      return 0;
    }
    this_player()->add_subloc(LELFY_FLET_SUBLOC,this_object());
    this_object()->move(this_player(),LELFY_FLET_SUBLOC);
	if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
	{
    write("Wieszasz sobie na szyi zniszczony, drewniany flet.\n");
    saybb(QCIMIE(this_player(),PL_MIA) + " wiesza sobie na szyi zniszczony, drewniany flet.\n");
	}
	else
	{
	write("Wieszasz sobie na szyi drewniany, elfi flet.\n");
    saybb(QCIMIE(this_player(),PL_MIA) + " wiesza sobie na szyi drewniany, elfi flet.\n");
	}
    czy_na_szyi=1;

    return 1;
}

int
zdejmij(string str)
{
  object *tablica;
  object *obiekty;
  int a;

  if(!str)
    {
      notify_fail("Co chcesz zdjac ?\n");
      return 0;
    }


   parse_command(str,environment(this_player()),"%i:"+PL_BIE,tablica);

   obiekty=NORMAL_ACCESS(tablica,0,0);


   if(sizeof(obiekty)<1)
     {
        notify_fail("Co chcesz zdjac ???\n");
        return 0;
     }

  for(a=0;a<sizeof(obiekty);a++)
     {
        if(obiekty[a]==this_object())
        {

    if(!czy_na_szyi)
      {
        notify_fail("Przeciez nie masz fletu na szyi !\n");
        return 0;
      }
      this_player()->remove_subloc(LELFY_FLET_SUBLOC);
	  if((GILDIA)->query_prawa(environment(this_object())->query_real_name())==LEV_WYGNANY)
	  {
	  write("Zdejmujesz z szyi zniszczony, drewniany flet.\n");
      saybb(QCIMIE(this_player(),PL_MIA) + " zdejmuje z szyi zniszczony, drewniany flet.\n");
	  }
	  else
	  {
	  write("Zdejmujesz z szyi drewniany, elfi flet.\n");
      saybb(QCIMIE(this_player(),PL_MIA) + " zdejmuje z szyi drewniany, elfi flet.\n");
	  }
      czy_na_szyi=0;

      return 1;
      }
     }
   notify_fail("Co chcesz zdjac ?\n");
   return 0;
}

void
remove_object()
{
if(czy_na_szyi)
    {     
  environment(this_object())->remove_subloc(LELFY_FLET_SUBLOC);
    tell_object(environment(this_object()),"Zdejmujesz z szyi drewniany, elfi flet.\n");
    tell_room(environment(environment(this_object())),QCIMIE(environment(this_object()),PL_MIA) + " zdejmuje z szyi drewniany, elfi flet.\n",({environment(this_object())}));
    czy_na_szyi=0;
   }
  ::remove_object();
}

string
query_recover()
{
    return 0;
}

void
dodawanie_soula()
{
    int a,b;
	int ile=0;
	object *tab;
	
	environment(this_object())->add_cmdsoul(LPATH+"lelf_soul.c");
    environment(this_object())->update_hooks();

}