#pragma strict_types

inherit "/d/Imperium/std/room";

#include "local.h"
#include "library.h"

#define ILE_MA_WYP "_live_i_library_i_book"

int no_books;       //obecna ilosc ksiazek
int temp_books;     //lista ksiazek oczekujacych do publikacji
string *tytuly;     //Tytuly ksiazek
string *temp_tytuly; //Tytuly oczekujace na zatwierdzenie
string temp;
object ob;          //Zmienna pomocna przy klonowaniu
string *admin;     //Administracja biblioteki

//Prototypy funkcji
int spis();
int wypozycz(string str);
int zwroc(string str);
int napisz(string str);
int admcheck();
int usun_temp(string tytul);

void
create_imperium_room()
{
  restore_object(LIBRARY_DIR+"saveob");
  set_short("Biblioteka w Athel Loren");
  set_long("Znajdujesz sie w bardzo duzym, jasnym pomieszczeniu wypelnionym "
     + "dlugimi szafami z mnostwem ksiazek. Sala zbudowana jest z delikatnego, "
     + "bialego marmuru. Nie przypomina innych elfich budynkow, jednak "
     + "taka sala jest niezbedna przy przechowywaniu wielu ksiazek, czesto bardzo cennych. "
     + "Mimo, ze sciany sa z kamienia, wygladaja na bardzo lekkie, choc wytrzymale. "
     + "Miedzy regalami kreci sie ilku bibliotekarzy, ktorzy pomogaja znalezc "
     + "poszukiwane ksiazki, oraz odkladaja zwrocone na polke. Na scianie wisi duza tablica "
     + "z regulami biblioteki.\n");

  add_item(({"szafe", "szafy", "ksiazki"}), 
    "Szafy wypelnione ksiazkami sa w calym pomieszczeniu. Wykonano je z mocnego drewna. " +
    "Ze wzgledu na ilosc ksiazek na nich ulozonych, w poszukiwaniach wybranego tytulu pomagaja krecacy sie po sali " +
    "bibliotekarze.\n");
  add_item(({"bibliotekarza", "bibliotekarzy"}), 
    "Bibliotekarze krzataja sie po calym pomieszczeniu zajeci " +
    "inwentaryzacja ksiazek i obslugiwaniem wypozyczajacych.\n");
  add_item("tablice","Na tablicy jest cos napisane ... Pewnie da sie to przeczytac !\n");
  add_cmd_item(({"tablice", "zasady"}), "przeczytaj", 
    "Biblioteka w Athel Loren.\n" +
    " Zasady korzystania z biblioteki :\n" +
    "  - Z biblioteki moze bezplatnie korzystac kazdy chetny\n" +
    "  - Wypozyczone ksiazki nalezy zwrocic niezwlocznie po przeczytaniu\n" +
    "  - W bibliotece nalezy zachowac bezwgledny spokoj i cisze\n" +
    "  - W bibliotece nalezy zachowywac sie tak, aby nie utrudniac innym korzystania z niej\n"+
    "Aby zorientowac sie, jakie ksiazki mozna wypozyczyc, nalezy " +
    "wykonac komende <spis>. Komendy <wypozycz> i <zwroc> nie wymagaja " +
    "komentarza. Kazdy z korzystajacych z biblioteki moze rowniez " +
    "napisac wlasna ksiazke (z pomoca komendy <napisz>) i przedstawic " +
    "ja administracji biblioteki. Jezeli ksiazka zostanie uznana za " +
    "wartosciowa, zostanie opublikowana i udostepniona innym.\n");

/* Tutaj znajduja sie wyjscia. wyjdz() nie pozwala graczowi wyjsc bez zwrotu
    wypozyczonych ksiazek  */    

  add_exit(PATH + "Athel/palac01.c", "wschod", "@@wyjdz", 1);

/* Pokoj administratora biblioteki */
  add_exit(LIBRARY_DIR + "admin.c","zachod","@@admcheck",1);

  add_exit(LIBRARY_DIR + "silence.c","polnoc","@@idzie_czytac",1);

  add_prop(ROOM_I_LIGHT, 5);
  add_prop(ROOM_I_INSIDE, 1);

  add_event("Przez sale przechodzi zamyslony elf z kilkoma ksiazkami pod pacha.\n");
  add_event("Do jednej z szafek podchodzi elf w kaplanskich szatach i zaczyna "
	+ "studiowac jedna z ksiazek.\n");
  add_event("Z pomiedzy szafek dochodzi stlumiony odglos ksiazki uderzajacej o podloge i "
	+ "rownie ciche przeklenstwo.\n");
  add_event("Zza jednej z szaf dochodzi oglos szybkiego wertowania ksiazki.\n");
  add_event("Jeden z bibliotekarzy przyglada sie ci ciekawie.\n");
  add_event("Z glebi sali dobiega cie glosny zgrzyt odsuwanego krzesla.\n");
  add_event("Do sali wchodzi kolejny, spragniony wiedzy kaplan.\n");
  add_event("Jeden z bibliotekarzy ucisza halasliwego goscia na koncu " +
  	    "sali.\n");
  set_events_on(1);
}

int 
idzie_czytac()
{
  object cela;

  TP->move(clone_object(LIBRARY_DIR+"silence.c"));

  tell_room(LIBRARY_DIR+"library.c",QCIMIE(TP,PL_MIA)+" odchodzi w glab " +
  "biblioteki w poszukiwaniu miejsca gdzie nikt nie zakloci jego spokoju.\n");
  write("Udajesz sie w glab biblioteki w poszukiwaniu miejca, gdzie nikt " +
  "nie zakloci twojego spokoju. Przechodzac pomiedzy szafami pelnymi " +
  "ksiazek dostrzegasz niewielki sekretarzyk stojacy troche na uboczu. " +
  "Tak ... To miejsce wyglada na bardzo ciche i spokojne.\n");
  return 1;
}

void 
init()
{
  ::init(); 

  add_action(spis, "spis");
  add_action(wypozycz,"wypozycz");
  add_action(zwroc,"zwroc");
  add_action(napisz,"napisz");
}

string 
malfem(string male,string female)
{
  if(TP->query_gender()==G_FEMALE) 
    return female;
  else return male;
}

int 
spis()
{
  int zp;
  write("Czytasz liste ksiazek znajdujacych sie w bibliotece.\n");
  write("Wynika z niej ze mozesz tutaj wypozyczyc:\n");
  for (zp=0;zp<no_books;zp++) 
    write((zp+1)+". "+tytuly[zp]+"\n");
  say(QCIMIE(TP,PL_MIA)+" czyta spisy ksiazek umieszczone na szafach.\n");
  return 1;
}

int 
tspis()
{
  int zp;
  write("Czytasz niewielka liste zawierajaca spis ksiazek czekajacych " +
  "na publikacje\n");
  write("Bedzie je mozna wyporzyczyc jako:\n");
  for (zp=0;zp<temp_books;zp++) 
    write(temp_tytuly[zp]+"\n");
  return 1;
}

int 
create_book(string zawartosc)
{
  if (zawartosc=="") 
    return 1;

  temp_tytuly=temp_tytuly+({temp});
  write_file(LIBRARY_DIR+temp_books+".tmp",zawartosc);
  temp_books++;
  save_object(LIBRARY_DIR+"saveob");
}

void 
give_book(int nr)
{
  object cbook;       //sklonowana ksiazka

  cbook=clone_object(LIBRARY_DIR+"book.c");
  cbook->set_long(tytuly[nr]);
  cbook->set_file(LIBRARY_DIR+nr);
  cbook->move(TP);
}

int 
clear_library()
{
  if(TP->query_nazwa(PL_MIA)!=ZARZADCA)
  {
    write("Nie jestes do tego upowazniony.\n");
    return 1;
  }
  no_books=1;
  temp_books=0;
  tytuly=({"Instrukcje"});
  admin=({ZARZADCA});
  temp_tytuly=({ });
  save_object(LIBRARY_DIR+"saveob");
}

int 
wydaj(int tn)
{
  if (tn<0||tn>no_books)
  {
    write("Po chwili wraca z powrotem i drapiac sie po glowie mowi:\n");   
    write("Nie moge jej znalezc w naszym ksiegozbiorze.\n"+
          "Po chwili dodaje: Moze to pomylka w tytule ??\n");
    say("Do "+QCIMIE(TP,PL_DOP)+" podchodzi bibliotekarz i zaczyna mu cos "+
        "tlumaczyc, po czym odchodzi z powrotem w glab sali.\n");
    return 1;
  }
 
  give_book(tn);
  tn=TP->query_prop(ILE_MA_WYP);
  TP->change_prop(ILE_MA_WYP,tn+1);
  write("Po chwili wraca z powrotem trzymajac w rece ksiazke. Dajac ci " +
        "ja dodaje:\n"+
        "Tylko prosze ja zwrocic, mamy tylko kilka egzemplarzy.\n");
  say("Do "+QCIMIE(TP,PL_DOP)+" podchodzi bibliotekarz z ksiazka, " +
      "wrecza mu ja szepczac cos i odchodzi w glab sali.\n");
  return 1;
}

int numer_na_tytul(string str)
{
	int i;
//	string *s=({});
// 	for (i;i<MAX_BOOKS;i++) s+=({i});
	if (sscanf(str,"%d",i));
	return i-1;
}


int 
wypozycz(string str)
{
  int tn;
  if (!str)
  {
    write("Wypozyczyc co?\n");
    return 1;
  }

  tn=member_array(str,tytuly);
  if (tn==-1) 
  	tn=numer_na_tytul(str);

  write("Podajesz tytul jednemy z bibliotekarzy, ktory szybko znika pomiedzy "
     + "szafami z ksiazkami.\n");
  say(QCIMIE(TP,PL_MIA)+" rozmawia chwile z jednym z bibliotekarzy, ktory " +
        "nastepnie udaje sie w kierunku szaf zapelnionych ksiazkami.\n");
  set_alarm(10.0,0.0,"wydaj",tn);
  return 1;
}

int 
wypozycz_temp(string co)
{
  int tn;
  object cbook;       //sklonowana ksiazka
  if (!co)
  {
    write("Wypozyczyc co?\n");
    return 1;
  }
  tn=member_array(co,temp_tytuly);
  if (tn<0||tn>no_books)
  { 
    write("Nie ma takiej ksiazki w kolejce.\n");
    return 1;
  } 
  cbook=clone_object(LIBRARY_DIR+"book.c");
  cbook->set_long(temp_tytuly[tn]);
  cbook->set_file(LIBRARY_DIR+tn+".tmp");
  cbook->move(TP); 
  write("Dostales kopie ksiazki oczekujacej w kolejce.\n");
} 

int 
zwroc(string str)
{
  object *obiekty;
  int rozmiar;
  int zwrot;
  int i;
  string opis1;
  string opis2;
  zwrot=0;
  if (!str&&str!="ksiazke"&&str!="ksiazki")
  {
    write("Zwrocic co?\n");
    return 1;
  }
  if (TP->query_prop(ILE_MA_WYP)<1) 
  {
    write("Nie posiadasz nic nalezacego do biblioteki.\n");
    return 1;
  } 
  obiekty=all_inventory(TP);
  rozmiar=sizeof(obiekty);
  for(i=0;i<rozmiar;i++)
  {
    if(MASTER_OB(obiekty[i])==LIBRARY_DIR+"book") 
    {
      obiekty[i]->remove_object();
      zwrot++;
     if(str=="ksiazke") break;
    }
  }
  if(zwrot<1) 
    write("Zaczynasz sie zastanawiac: Co tez ja z nia zrobil"+
          malfem("em","am")+"?\n");
   
  opis1="Oddal"+malfem("es ","as ")+zwrot;
  opis2=QCIMIE(TP,PL_MIA)+" oddal"+malfem("","a");

  if(zwrot==1) 
  { 
    opis1+=" ksiazke";
    opis2+=" ksiazke";
  }
  if(zwrot>1&&zwrot<5) 
  { 
    opis1+=" ksiazki";
    opis2+=" ksiazki";
  }
  if(zwrot>4) 
  { 
    opis1+=" ksiazek";
    opis2+=" ksiazki";
  }
 
  opis1+=" najblizszemu bibliotekarzowi, ktory powoli odchodzi w kierunku" +
         " szaf aby odlozyc ksiazki zebrane w czytelni.\n";
  opis2+=" najblizszemu bibliotekarzowi, ktory powoli odchodzi w kierunku" +
         " szaf aby odlozyc ksiazki zebrane w czytelni.\n";
  write(opis1);
  say(opis2);

  TP->change_prop(ILE_MA_WYP,TP->query_prop(ILE_MA_WYP)-zwrot);

  return 1;
} 

/*Stara funkcja wyjdz

int 
wyjdz()
{
  int i=TP->query_prop(ILE_MA_WYP);
  if(i>0) 
    write("Juz chcesz wyjsc, ale widzac mine jednego z bibliotekarzy, dochodzisz do "
      + "wniosku, ze rozsadnie byloby zwrocic ksiazke.\n");
  return i;
}
*/

int 
wyjdz()
{
  object *lista=deep_inventory(TP);
  int i=sizeof(lista)-1;
  for (;i>=0;i--) 
  {  
    if (lista[i]->query_prop(OBJ_I_BIBLIOTEKA_W_ATHEL))
    {
    	write("Juz chcesz wyjsc, ale widzac mine jednego z bibliotekarzy, dochodzisz do "
      + "wniosku, ze rozsadnie byloby zwrocic ksiazke.\n");
        return 1;
    }
  }
  return 0;
}

int 
napisz(string str)
{
  object cela;

  if(!str)
  {
    write("Ksiazka bez tytulu !? Jak sobie to wyobrazasz ?\n");
    return 1;
  }
  temp=str;
  TP->move(clone_object(LIBRARY_DIR+"silence.c"));
  tell_room(LIBRARY_DIR+"library.c",QCIMIE(TP,PL_MIA)+" odchodzi w glab " +
  "biblioteki w poszukiwaniu miejsca gdzie nikt nie zakloci jego spokoju.\n");
  write("Udajesz sie w glab biblioteki w poszukiwaniu miejca, gdzie nikt " +
  "nie zakloci twojego spokoju. Przechodzac pomiedzy szafami pelnymi " +
  "ksiazek dostrzegasz niewielki sekretarzyk wyposazony we wszystkie " +
  "potrzebne ci przybory. Przygladajac sie mu odnosisz wrazenie, iz " +
  "zostal on tutaj specjalnie dla ciebie postawiony. Siadasz na krzesle " +
  "starajac sie zajac wygodna pozycje, otwierasz buteleczke inkaustu, " +
  "kladziesz przed soba czysta kartke papieru, bierzez do reki pioro, " +
  "moczysz je i zaczynasz pisac.\n");
  clone_object("/obj/edit.c")->edit("create_book");
  return 1;
}

/* 
 * Funkcja do przedefiniowania... ew guildmasterzy gildii w ktorych jest
 * bibiloteka, etc.
 */
string *
query_std_admini()
{
    return ({});
}

string *
query_admini()
{
    return admin + query_std_admini();
}

int 
admcheck()
{
  int i;

  i=member_array(TP->query_nazwa(PL_MIA), query_admini());
  if(i<0) 
    write("Tylko osoby opowaznione przez zarzadce biblioteki moga tam wchodzic !\n");
  if(i>=0) 
    return 0; 
  return 1;
}

int 
mk_admin(string kto)
{
  if(TP->query_nazwa(PL_MIA)!=ZARZADCA)
  {
    write("Nie jestes do tego upowazniony.\n");
    return 1;
  }
  admin=admin+({kto});
  write(kto+" zostal dodany do listy administratorow biblioteki.\n");
  tell_object(find_player(lower_case(kto)), "\n\nW twoim umysle pojawia " +
  "sie wizja postaci przemawiajacej do ciebie. Gdy probujesz sie jej " +
  "przyjrzec, kontury zaczynaja sie rozmywac lecz zamazany obraz " +
  "pozostaje. Pomimo iz nie widzisz aby jej usta otwieraly sie, slyszysz " +
  "w swoim umysle jej glos. Nagle w twoim umysle pojawia sie wiedza na " +
  "temat tej osoby. Jest to sam mistrz " + capitalize(ZARZADCA) + 
  ", zarzadca biblioteki w Athel Loren. Powoli zaczyna " +
  "do ciebie docierac sens slow wymawianych przez niego :\n\n" +
  "Jestem czlowiekiem bardzo zajetym i nie mam zbyt duzo czasu. Doceniajac " +
  "twoj upor postanowilem ci powierzyc bardzo odpowiedzialna funkcje. " +
  "Zostales przyjety do grona osob odpowiedzialnych za stan mojej " +
  "biblioteki w Athel Loren. Od tej chwili mozesz wejsc " +
  "do archiwum. Bedziesz odpowiedzialny za dopuszczenie lub nie ksiazek " +
  "do publikacji. Nie zawiedz mojego zaufania i wykaz sie madroscia " +
  "dokonujac wyborow.\n\n Powoli jego obraz zaczyna sie rozmywac " +
  "znikajac po chwili zupelnie.\n");
  save_object(LIBRARY_DIR+"saveob");
  return 1;
}

int 
rm_admin(string kto)
{
  if(TP->query_nazwa(PL_MIA)!=ZARZADCA)
  {
    write("Nie jestes do tego upowazniony.\n");
    return 1;
  }
  admin-=({kto});
  tell_object(find_player(lower_case(kto)), "\n\nW twoim umysle pojawia " +
  "sie wizja postaci przemawiajacej do ciebie. Gdy probujesz sie jej " +
  "przyjrzec, kontury zaczynaja sie rozmywac lecz zamazany obraz " +
  "pozostaje. Pomimo, iz nie widzisz aby jej usta otwieraly sie, slyszysz " +
  "w swoim umysle jej glos. Nagle w twoim umysle pojawia sie wiedza na " +
  "temat tej osoby. Jest to sam mistrz " + ZARZADCA + 
  ", zarzadca biblioteki Athel Loren. Powoli zaczyna do " +
  "ciebie docierac sens slow wymawianych przez niego :\n\nZ powodu " +
  "zaistnialych okolicznosci nie mozesz dluzej piastowac tak " +
  "odpowiedzialnej funkcji w mojej bibliotece w Athel Loren. " +
  "Dokladniejsze informacje zostana wyslane do ciebie poczta.\n" +
  "\nPowoli jego obraz zaczyna sie rozmywac znikajac po chwili zupelnie.\n");
  write(kto + " nie jest juz administratorem biblioteki.\n");
  save_object(LIBRARY_DIR+"saveob");
  return 1;
}

int 
accept(string co)
{
  int tn;
  int i;

  if(!co)
  {
    write("Zaakceptowac co?\n");
    return 1;
  }
  if(admcheck()!=0)
  { 
    write("Nie jestes do tego upowazniony.\n");
    return 1;
  }

  tn=member_array(co,temp_tytuly);

  if(tn<0||tn>temp_books)
  {
    write("Nie ma takiego tytulu w kolejce!!!\n");
    return 1;
  }
 
  tytuly+=({co});

  write_file(LIBRARY_DIR+no_books,read_file(LIBRARY_DIR+tn+".tmp"));
  no_books++;
  usun_temp(co); 
  save_object(LIBRARY_DIR+"saveob");
  write(co + " jest juz w trakcie publikacji i niedlugo bedzie dostepna " +
  "w bibliotece.\n");
  return 1;
}

int 
usun_temp(string tytul)
{
  int tn;
  int i;
 
  if(admcheck()!=0)
  {
    write("Nie jestes do tego upowazniony.\n");
    return 1;
  }

  tn=member_array(tytul,temp_tytuly);
  temp_tytuly-=({tytul});

  rm(LIBRARY_DIR+tn+".tmp");
  temp_books--;
  for(tn;tn<temp_books;tn++)
  {
    i=tn+1;
    rename(LIBRARY_DIR+i+".tmp",LIBRARY_DIR+tn+".tmp");
  }
  save_object(LIBRARY_DIR+"saveob");
}

int 
usun(string tytul)
{
  int tn;
  int i;
 
  if(TP->query_nazwa(PL_MIA)!=ZARZADCA)
  { 
    write("Nie jestes do tego upowazniony.\n");
    write(TP->query_imie(PL_MIA));
    return 1;
  }

  tn=member_array(tytul,tytuly);
  tytuly-=({tytul});

  rm(LIBRARY_DIR+tn);
  no_books--;
  for(tn;tn<no_books;tn++)
  {
    i=tn+1;
    rename(LIBRARY_DIR+i,LIBRARY_DIR+tn);
  }
  save_object(LIBRARY_DIR+"saveob");
}
