/*
 * Straznik skrzyni w gildii Lesnych Elfow
 *
 *  by Tanis
 *  lipiec 1998
 */

inherit "/d/Imperium/std/monster.c";

#include "ogolne.h"
#include "lelf.h"

#define MAX_NOTES 100

void zmiana_autora(int numer,string imie);

mixed *notes=({}); // Tutaj zapisujemy informacje o wkladajacych i ich uwagach.


mixed *porzadkuj(mixed *tab1)
{
	int a,b=1,c;
	int max=-1;
	mixed *tab2=({});

	while(b)
	{
		b=0;
		
		max=-1;
		
		for(a=1;a<sizeof(tab1);a=a+2)
		{
			if(tab1[a]>max)	max=tab1[a];
		}
		
	if(max>-1)
	 {
		for(a=1;a<sizeof(tab1);a=a+2)
		{
			if(tab1[a]==max)
			  {
			  		tab2=tab2+({tab1[a-1],tab1[a]});
			        tab1[a]=-2;
			        a=sizeof(tab1)+5;
			  }
		}
		b=1;
	 }
	}
	
	return tab2;
}

mixed *oblicz_wyniki()
{
    mixed *stat=({});
    mixed ind, war;
    mapping wynik=(GILDIA)->query_wynik();
	int a,sz;
	
	     ind = m_indices(wynik); // Pomiedzy tymi dwoma intrukcjami, nie
	     war = m_values(wynik); // powinno byc zadnych dzialan na mappingu.

   sz=sizeof(ind);

   for(a=0;a<sz;a++)
      { stat+=({ ind[a],(sizeof(war[a])-1) }); //Tutaj odejmujemy 1, bo przy zglaszaniu kandydata dostal jeden glos gratisowy, zgloszony jakby przez osobe o mieniu "!"
      }

   return porzadkuj(stat);
}

void
okroj_notes()
{
   int wielkosc;

   wielkosc=sizeof(notes);

   notes=notes[wielkosc-MAX_NOTES..wielkosc];
}

void
create_monster()
{
    setuid();
    seteuid(getuid());

    restore_object(LPATH+"operacje");

    okroj_notes();
    
    ustaw_imie (({"ariendel", "ariendela",
    		  "ariendelowi", "ariendela",
    		  "ariendelem", "ariendelu"}),PL_MESKI_OS);
    		  
    ustaw_odmiane_rasy (PL_ELF);

    dodaj_przym ("wysoki","wysocy");
    dodaj_przym ("silny","silni");
               
//    dodaj_nazwy( ({"ariendel", "ariendela",
//    		  "ariendelowi", "ariendela",
//    		  "ariendelem", "ariendelu"}),
//    		 ({"ariendel", "ariendela",
//    		  "ariendelowi", "ariendela",
//    		  "ariendelem", "ariendelu"}),
//    		 PL_MESKI_OS);

    dodaj_nazwy( ({"straznik","straznika","straznikowi","straznika","straznikiem","strazniku"}),
                 ({"straznicy","straznikow","straznikom","straznikow","straznikami","straznikach"}),
                 PL_MESKI_OS);
    	
    set_long ("Ten wysoki, silny elf na pierwszy rzut oka wyglada na straznika. Ma mocny, skorzany stroj i wygodne, choc "
       + "na pewno mocne buty. W prawej rece trzyma niezbyt duza, drewniana tabliczke, na ktorej od czasu "
       + "do czasu zapisuje cos kawalkiem kredy. Choc pelni teraz role jakiegos sekretarza widac, ze nadal zdolny jest do zacietej walki.\n");

    set_gender(G_MALE);

    add_prop(CONT_I_WEIGHT, 60000);
    add_prop(CONT_I_HEIGHT, 190);

    add_prop(OBJ_M_NO_ATTACK, "Ten Elf cieszy sie szacunkiem wszystkich Lesnych Elfow. " +
            this_player()->koncowka("Narazilbys","Narazilabys") + " sie calej gildii!\n");

    set_skill(SS_DEFENCE, 25 + random(5));
    set_skill(SS_WEP_SWORD, 25 + random(10));
    set_skill(SS_UNARM_COMBAT, 15 + random(5));
    set_skill(SS_PARRY, 15 + random(10));

    set_stats(({ 65, 60, 65, 60, 60, 50}));

    set_default_answer(VBFC_ME("standardowa_odp"));
    add_ask(({"wybory","wynik wyborow","wynik","wyniki","wynik ostatnich wyborow"}),VBFC_ME("wynik_odp"));
    add_ask(({"tabliczke","drewniana tabliczke","tablice","drewniana tablice"}),VBFC_ME("tablica_odp"));
    add_ask( ({"obecnych","obecnych elfow","obecnych lesnych elfow","obecnosc elfow"}), VBFC_ME("obecni_odp"));

    set_act_time(15);
    add_act("emote przyglada ci sie ciekawie.");
    add_act("emote oglada swoja tabliczke.");
    add_act("emote rozglada sie wokolo.");
    add_act("emote zamysla sie gleboko.");

    set_alignment(400);

    add_armour(PATH+"Lelfy/flet");
    add_weapon(PATH + "bronie/e_miecz.c");
}

void
remove_object()
{
    if (IS_CLONE)
       save_object(LPATH+"operacje");

   ::remove_object();
}

string
standardowa_odp()
{
    command("powiedz Nie jestem w stanie ci w tym pomoc... Moim zadaniem jest tylko notowanie kto zostawia lub bierze cos ze skrzyni Lesnych Elfow...");
    command("powiedz Znam tez wyniki ostatnich wyborow do rady Lesnych Elfow....");
    command("powiedz Notuje tez kto z Lesnych Elfow jest obecny w grze.");
    command("powiedz Jesli cie to interesuje, po prostu zapytaj.");
    command("usmiechnij sie przyjaznie");
    return "";
}

int
liczba_glosow(mixed *wyniki)
{
    int a;
    int ile=0;
	
    for(a=1;a<sizeof(wyniki);a=a+2)
       {
       		ile=ile+wyniki[a];
       }
       
   return ile;
}

string
odmien_elfow(int ile)
{
   string s,nap;
   
   s= " "+ile+"";
   nap=s[strlen(s)-2..strlen(s)-1];
   
   if(ile==1) return "Lesny Elf oddal swoj glos";
   if(nap=="2" || nap=="3" || nap=="4") return "Lesne Elfy oddaly swe glosy";
   
   return "Lesnych Elfow oddalo swe glosy";
}

string
wynik_odp()
{
    string napis;
    int a;
    object kto=this_player();
    mixed *wyniki=oblicz_wyniki();	
	
	
    if((GILDIA)->stan_glosowania()!=0)
      {
          command("powiedz Nie moge zdradzic wynikow, gdyz glosowanie nadal trwa !");
          command("powiedz Moge ci jedynie powiedziec, ile osob do tej pory wzielo udzial w wyborach.");
          if(liczba_glosow(wyniki)>0) command("powiedz Otoz juz " +liczba_glosow(wyniki) + " " +odmien_elfow(liczba_glosow(wyniki))+".");
          else command("powiedz Wlasciwie to w tym glosowaniu jeszcze nikt nie zaglosowal...");
          return "";
      }
      
    if(liczba_glosow(wyniki)==0)
      {
          command("powiedz Hmmm.... w ostatnim glosowaniu nikt nie wzial udzialu !");
          return "";
      }
    
    command("powiedz Moze po prostu pokaze ci tabliczke z wynikiem wyborow ?");
    command("powiedz Oto ona !");
    napis=query_Imie(kto) + " pokazuje ci drewnina tabliczke. Na tabliczce widzisz :\n\n";
    tell_room(environment(this_object()),QCIMIE(this_object(),PL_MIA) + " pokazuje drewnina tabliczke " + QIMIE(kto,PL_CEL) + "\n",kto);
    
    napis+="Wyniki ostatnich wyborow do Rady Lesnych Elfow :\n\n";
    for(a=0;a<sizeof(wyniki);a=a+2)
       {
       		napis+="\t" + capitalize(wyniki[a]) + " - " + wyniki[a+1] + "\n";
       }
    napis+="\n";
    
    kto->more(napis);
    
	return "";
}

string
tablica_odp()
{
    command("powiedz Na tej tabliczce zapisuje kto, co i kiedy bierze lub wklada do skrzyni Lesnych Elfow.");
    if((GILDIA)->query_prawa(this_player()->query_real_name())>=LEV_RADNY)
       command("powiedz Jesli chcesz obejrzec, co zostalo wlozone lub wyjete, popros o pokazanie tabliczki.");
    return "";
}

int
query_member(object kto)
{
   if (kto->query_wiz_level()) return 0;
   if((GILDIA)->query_prawa(kto->query_real_name())>=LEV_CZLONEK) return 1;
   return 0;
}

int
porownaj(object arg1, object arg2)
{
   if (arg1->query_real_name() < arg2->query_real_name())
      return -1;
   return 1;
}

string
obecni_odp()
{
   object *obecni;
   int i;
   string str="\n";
   
   obecni=users();
   obecni=filter(obecni,query_member);
   
   if (!sizeof(obecni))
      {
        command("powiedz do " + OB_NAME(TP) + " W tej chwili nie ma zadnego Lesnego Elfa.");
      }
   obecni=sort_array(obecni, "porownaj");
   for (i=0;i<sizeof(obecni);i++)
      {
         str+="\t"+
         capitalize(obecni[i]->query_real_name()) + " " +
         	obecni[i]->query_guild_title_race() + "\n";
      }
   command("powiedz do " + OB_NAME(TP) + " Pokaze ci tabliczke gdzie wszystko zapisalem.");
   write(short(TP,PL_MIA) + " pokazuje ci nieduza tabliczke, na ktorej jest napisane:\n");
   say(QCIMIE(TO,PL_MIA) + " pokazuje " + QIMIE(TP,PL_CEL) + " nieduza tabliczke.\n");
   TP->catch_msg(str);
   return "";
}

void
add_introduced(string imie)
{
    set_alarm(2.0, 0.0, "return_introduce", imie);
}

string
query_presentation()
{
    return "Ariendel, Straznik Skrzyni Lesnych Elfow, elf";
}

void
return_introduce(string kto)
{
    command("przedstaw sie " + OB_NAME(find_player(kto)));
}

string
data_imperium()
{
  // return ("/d/Imperium/std/room/kalendarz.c")->zwroc_krotka_date();
  return ctime(time(),1);
}

void
pisz_kreda()
{
   command("emote zapisuje cos na swej tabliczce.");
   return;
}

void
wklada(object co, object kto)
{
    if(!kto) return;
    if(!co) return;

//    if(!find_player(kto->query_real_name())) return;
//  command("powiedz "+co->short()+" "+kto->short());
    if(!function_exists("add_exp",kto)) return;
    notes=notes+({ ({0,kto->query_real_name(),kto->koncowka(" wlozyl "," wlozyla "),co->short(this_object(),PL_BIE),data_imperium()}) });
    pisz_kreda();
}

void
bierze(object co, object kto)
{
    if(!kto) return;
    if(!co) return;

//    if(!find_player(kto->query_real_name())) return;
//  command("powiedz "+co->short()+" "+kto->short());
    if(!function_exists("add_exp",kto)) return;
    notes=notes+({ ({0,kto->query_real_name(),kto->koncowka(" wzial "," wziela "),co->short(this_object(),PL_BIE),data_imperium()}) });
    pisz_kreda();
}

string
zwroc_date(string data)
{
 return " - " + data + ".";
}

int
prosi_o_tabliczke(string str)
{
   int a;
   object *tablica;
   string napis;
   object *obiekty;
   object kto=this_player();

   if(!str)
     {
         notify_fail("Kogo i o co chcesz poprosic?\n");
         return 0;
     }

   parse_command(str,environment(this_player()),"%l:"+PL_BIE+" %s",tablica,napis);

   obiekty=NORMAL_ACCESS(tablica,0,0);

   if(sizeof(obiekty)>1)
     {
       notify_fail("Musisz podac tylko jedna osobe!\n");
       return 0;
     }

   if(sizeof(obiekty)<1)
     {
        notify_fail("Kogo chcesz prosic?\n");
        return 0;
     }

   if((napis=="o pokazanie tabliczki" || napis=="o tabliczke") && obiekty[0]==this_object())
     {

       say(QCIMIE(this_player(),PL_MIA)+" prosi " + QIMIE(this_object(),PL_BIE) + " o pokazanie tabliczki.\n");
       write("Prosisz " + query_imie(this_player(),PL_BIE) + " o pokazanie ci tabliczki.\n"); 

       if(sizeof(notes)==0)
        {
          write("Drewniana tabliczka trzymana przez " + query_imie(this_player(),PL_BIE) + " jest pusta.\n");
          return 1;
        }

      napis="Na tabliczce napisano kreda:\n\n";

      for(a=0;a<sizeof(notes);a++)
         {
            if(notes[a][0]==0)
              {
               napis+=capitalize(notes[a][1])+notes[a][2]+notes[a][3]+zwroc_date(notes[a][4])+"\n";
              }
            if(notes[a][0]==1)
              {
               napis+=capitalize(notes[a][1])+notes[a][2]+notes[a][3]+zwroc_date(notes[a][4])+"\n";
              }
       }

    kto->more(napis);

   return 1;
    }

   notify_fail("Kogo i o co chcesz poprosic?\n");
   return 0;
}

int
numery_wpisow(string str)
{
   int a;
   string napis;
   object kto=this_player();

      napis="Na tabliczce napisano kreda:\n\n";

      for(a=0;a<sizeof(notes);a++)
         {
            if(notes[a][0]==0)
              {
               napis+=(a+1)+". "+capitalize(notes[a][1])+notes[a][2]+notes[a][3]+zwroc_date(notes[a][4])+"\n";
              }
            if(notes[a][0]==1)
              {
               napis+=(a+1)+". "+capitalize(notes[a][1])+notes[a][2]+notes[a][3]+zwroc_date(notes[a][4])+"\n";
              }
       }

    kto->more(napis);

   return 1;
}

int
skasuj_wpis(string str)
{
   int numer,a;
   mixed tablica=({});

   if(!str)
      {
         notify_fail("Musisz jeszcze podac numer wpisu, ktory chcesz skasowac !\n");
         return 0;
      }

  numer=atoi(str);

  if(numer>sizeof(notes) || numer<1)
    {
       notify_fail("Nie ma wpisu o takim numerze...\n");
       return 0;
    }

  for(a=0;a<sizeof(notes);a++)
     {
       if(a!=(numer-1)) tablica=tablica+({ notes[a] });
     }

  notes=tablica;

  write("Wpis numer " + numer + " zostal skasowany!\n");

  return 1;
}

void
zmiana_autora(int numer,string imie)
{
    if(!imie)
      {
         write("Musisz podac jakies imie! Autor wpisu numer " + numer + " pozostaje nie zmieniony.\n");
         return;
      }

    imie=lower_case(imie);

    notes[numer-1][1]=imie;
    write("Autorem wpisu numer " + numer + " jest teraz " + capitalize(imie)+"!\n");
}

int
przemianuj_autora(string str)
{
   int numer;

   if(!str)
      {
         notify_fail("Musisz jeszcze podac numer wpisu, ktorego autora chcesz zmienic !\n");
         return 0;
      }

  numer=atoi(str);

  if(numer>sizeof(notes) || numer<1)
    {
       notify_fail("Nie ma wpisu o takim numerze...\n");
       return 0;
    }

  write("Podaj imie nowego autora wpisu numer " + numer + ":\n");
  input_to(&zmiana_autora(numer));

  return 1;
}

void
zabron_imie(string imie,object kto)
{
     imie=lower_case(imie);
	 
     if(!(GILDIA)->zabron_dostepu(kto,imie)) return;
	 
	 command("szepnij " + OB_NAME(kto) + " Dobrze... " + capitalize(imie)+" nie bedzie mogl od teraz wziac niczego ze skrzyni.");
	 return;	 
}

int
zabron_dostepu(string str)
{
    str=lower_case(str);
	
    if(str!="dostepu do skrzyni")
	{
	    notify_fail("Czego chcesz zabronic? Dostepu do skrzyni?\n");
		return 0;
	}
	
	write("Podaj teraz imie tej osoby, ktorej chcesz zabronic dostepu do skrzyni: ");
	input_to("zabron_imie",0,this_player());
	return 1;
}

void
zezwol_imie(string imie,object kto)
{
     imie=lower_case(imie);
	 
     if(!(GILDIA)->zezwol_na_dostep(kto,imie)) return;
	 
	 command("szepnij " + OB_NAME(kto) + " Dobrze... " + capitalize(imie)+" od teraz ponownie moze korzystac z naszej skrzyni.");
	 return;	 
}

int
zezwol_na_dostep(string str)
{
    str=lower_case(str);
	
    if(str!="na dostep do skrzyni")
	{
	    notify_fail("Na co chcesz zezwolic? Na dostep do skrzyni?\n");
		return 0;
	}
	
	write("Podaj teraz imie tej osoby, ktorej chcesz ponownie zezwolic na dostep do skrzyni: ");
	input_to("zezwol_imie",0,this_player());
	return 1;
}

void
init_living()
{
    ::init_living();

    if((GILDIA)->query_prawa(this_player()->query_real_name())>=LEV_RADNY)
	{
	    add_action(prosi_o_tabliczke,"popros");
		add_action(zabron_dostepu,"zabron");
		add_action(zezwol_na_dostep,"zezwol");
	}

      if(this_player()->query_wiz_level())
        {
           add_action("numery_wpisow","numery");
           add_action("skasuj_wpis","skasuj");
           add_action("przemianuj_autora","przemianuj");
        }
}

int
zakaz_brania(object kto)
{
	string imie=kto->query_real_name();
	
	if((GILDIA)->zwroc_osobe(imie))
	  if((GILDIA)->zwroc_osobe(imie)[3]==1) return 0; // Dany gracz moze braz ze skrzynki.
	  if(kto==find_player("tanis")) return 0; // Taniseq zawsze moze! :)
	  
	say(QCIMIE(kto,PL_MIA)+" chce cos wziac ze skrzyni, ale " + QIMIE(this_object(),PL_MIA) + " zastepuje "+kto->koncowka("mu","jej")+" droge mowiac: Z polecenia rady mam nie wydawac ci niczego ze skrzyni!\n");
    kto->catch_msg("Chcesz siegnac do skrzyni, gdy " + query_imie(this_player(),PL_MIA) + " zastepuje ci droge mowiac: Z polecenia rady mam nie wydawac ci niczego ze skrzyni!\n");
	
	return 1;
}