/* To jest sala narad. Tutaj podejmowane sa przez kapitule wszystkie kluczowe
 dla zycia Zakonu decyzje, tutaj rowniez mianuje sie nowych czlonkow Rady i
 wybiera Wielkiego Mistrza. Jak zwykle darujemy sobie eventy, zeby nie zaklocac
 porzadku narad i uroczystosci.
 */
 
inherit "/d/Imperium/std/room";
#include "mith.h"
#include "uprawnienia.h"
#include <filter_funs.h>
#include <cmdparse.h>
#define WYBRANY_NA_MISTRZA "_zostalem_wybrany_na_mistrza!!!_"

mapping glosowanie=([]);
mapping usuwanie_z_rady=([]);
mapping usuwanie_z_zakonu=([]);
reset_imperium_room()
{
	object *gracze=FILTER_PLAYERS(all_inventory(this_object()));
	if (!gracze || sizeof(gracze)==0) glosowanie=([]);
}

create_imperium_room()
{
	set_short("Sala narad");
	set_long(" Jest to niezbyt duza, ale przestronna sala. Na przeciwko"
		+" drzwi u stop duzego pomnika Sigmara stoi wysoki, debowy fotel. "
		+"Do fotela przysunieto niezbyt dlugi stol. Kolo stolu stoja jeszcze"
		+" trzy krzesla. Swiatlo zapewniaja w dzien szerokie okna w scianach, "
		+"w nocy liczne swiece stojace na stojakach pod scianami i na stole. "
		+"Posrodku stolu lezy wielki, ozdobny tom w twardej oprawie.\n");
	add_item(({"stol","krzesla"})," Wiekszosc pokoju zajmuje dosyc duzy, "
		+"debowy stol. Wokol niego stoja trzy krzesla i duzy, ozdobny, rowniez"
		+" debowy fotel. Stol jest bardzo czysty, nie widac na nim zadnych+" 
		+" spotykanych na stolach sladow uzywania: szczerb, plam, rys. "
		+"Posrodku stolu lezy ogromny tom w twradej oprawie.\n");
	add_item(({"tom","ksiege"})," Posrodku stolu lezy olbrzymi tom w twardej"
		+" oprawie. Tom wyglada na bardzo stary, nie jestes w stanie"
		+" rozczytac tytulu. Dostrzegasz na okladce jedynie symbole mlota i"
		+" dwoch polaczonych katami kwadratow. Tom zawiera spis praw, "
		+"ceremonialow i zasad Zakonu Sigmara. Jego zadaniem jest"
		+" rozstrzygac problemy Wielkiej Rady. W nim rowniez zapisuje sie"
		+" wszystkie nowe uchwaly, zanim zostana skopiowane do udostepnianych "
		+"publicznie tomow w bibliotece.\n");
	add_item("posag","Pod jedna ze scian stoi dosyc duzy jak na rozmiary "
		+"pokoju posag siedzacego mezczyzny z dlugimi, jasnymi wlosami, "
		+"trzymajacego w rekach wielki mlot bojowy. Jest to patron Zakonu i"
		+" Imperium, starozytny bohater, przyjety w poczet bogow, Sigmar"
		+" zwany Mlotodzierzca.\n");
	add_item(({"fotel"})," U stop posagu stoi wieksze od innych krzeslo. Jest"
		+" to wlasciwe fotel, ale wykonano go z charakterystyczna dla calego"
		+" wyposazenia zamku surowoscia. Choc wiec drewniane czesci "
		+"wystrugano bardzo starannie, nic nie oslania twardego, debowego"
		+" siedzenia. Fotel stoi u szczytu zajmujacego wiekszosc sali"
		+" stolu.\n");
    add_exit(ZAMEK + "korytarz1.c","poludnie");
    add_prop(ROOM_I_INSIDE,1);
	reset_imperium_room();
}

init ()
{
   ::init();
	add_action("glosuj","krzyknij");
	add_action("wstap","wstap");
	add_action("usun","usun");
	add_action("mianuj","mianuj");
	add_action("pozwol","pozwol");
	add_action("zabron","zabron");

}
	

usun_prawa(string imie, int calkowicie=0)
{
	int i;
	for (i=0;i<=30;i++) PRAWA->usun_prawa(i,imie);
	if (PRAWA->query_mistrz()==imie) PRAWA->set_mistrz("");
	
	if (!calkowicie) PRAWA->dodaj_prawa_brata_zakonnego(imie);
	else PRAWA->usun(imie);
}

int
mianuj(string str)
{
	object *kogom, kogo;
	string *urzedy=({"mistrzem","marszalkiem","komturem","szatnym"});
	int n;
	if (PRAWA->query_mistrz()!=TP->query_real_name()) return notify_fail("Tylko Wielki Mistrz moze mianowac nowych czlonkow Kapituly.\n");
	if (!str) return notify_fail("Poprawna skladnia: mianuj 'kogo' 'kim'.\n");
	parse_command(str,users(),"%l:"+PL_BIE+" %s", kogom, str);
	kogom=NORMAL_ACCESS(kogom,0,0);
	if (!sizeof(kogom) || sizeof(kogom)>1) return notify_fail("Kogo chcesz mianowac?\n");
	kogo=kogom[0];	
	if (PRAWA->sprawdz_prawa(CZLONEK_RADY,kogo->query_real_name())) return notify_fail("On juz jest czlonkiem Kapituly Zakonnej!\n");
	if (!PRAWA->sprawdz_prawa(PRAWA_RYCERZA,kogo->query_real_name())) return notify_fail(kogo->short(PL_MIA)+" nie jest Bratem Zakonnym.\n");
	write(str);
	n=member_array(str,urzedy);
	if (n==-1) 
		return notify_fail("Na jakie stanowisko w Kapitule chcesz mianowac "+kogo->short(PL_BIE)+"?\n"); 
	if (str=PRAWA->query_urzednik(n)) return notify_fail(C(str)+" jest Wielkim "+C(urzedy[n])+".\n");
	str=kogo->query_real_name();
	PRAWA->mianuj(str, n);
	write("Mianowales "+kogo->short(PL_BIE)+" Wielkim "+C(urzedy[n])+".\n");
	kogo->catch_msg("Z woli Sigmara i Wielkiego Mistrza Zakonu zostales mianowany Wielkim "+C(urzedy[n])+". Niech cie Pan wspiera i prowadzi.\n");
	tell_room(QCIMIE(kogo,PL_MIA)+" zostal mianowany Wielkim "+C(urzedy[n])+".\n",({TP,kogo}));
	return 1;
}
		

int
usun(string str)
{
	string imie=TP->query_real_name(), *glosy;
	int licznik,n;
	str=L(str);
	if (!PRAWA->sprawdz_prawa(CZLONEK_RADY,imie)) return notify_fail("Nie jestes czlonkiem Kapituly Zakonnej!\n");
	if (!str) return notify_fail("Kogo chcesz usunac i z czego? Z Kapituly? Z Zakonu?\n");
	if (wildmatch("z rady*",str))
	{
		sscanf(str,"z rady %s",str);
		if (!PRAWA->sprawdz_prawa(CZLONEK_RADY,str))
			return notify_fail("Nie ma takiego czlonka Rady. Pamietaj o podaniu imienia w mianowniku.\n");
		usuwanie_z_rady[imie]=str;
		glosy=m_values(usuwanie_z_rady);
		for (n=sizeof(glosy)-1;n>=0;n--)
			if (glosy[n]==str) licznik++;
		if (licznik>=2)
		{
			tell_room(this_object(),C(str) + " zostal usuniety z Kapituly. Jego nastepce wyznaczy Wielki Mistrz.\n");
			usun_prawa(str);
			usuwanie_z_rady=([]);
			write_file(LOG,C(str)+" usuniety z Kapituly. "+ctime(time())+"\n");
		}
		else write("Twoj glos zostal zapisany, ale musi cie poprzec inny czlonek Kapituly.\n");
		return 1;
	}
	if (wildmatch("z zakonu*",str))
	{
		sscanf(str,"z zakonu %s", str);
		if (!PRAWA->sprawdz_prawa(PRAWA_RYCERZA, str))
			return notify_fail(C(str)+" nie jest Bratem Zakonnym. Pamietaj o podaniu imienia w mianowniku.\n");
		usuwanie_z_zakonu[imie]=str;
		glosy=m_values(usuwanie_z_zakonu);
		for (n=sizeof(glosy)-1;n>=0;n--)
			if (glosy[n]==str) licznik++;
		if (licznik>=2)
		{
			tell_room(this_object(),C(str) + " z woli Sigmara i Kapituly zostal usuniety z grona Braci Zakonnych.\n");
			usun_prawa(str,1);
			usuwanie_z_zakonu=([]);
			write_file(LOG,C(str)+" usuniety z Zakonu. "+ctime(time())+"\n");
		}
		else write("Twoj glos zostal zapisany, ale musi cie poprzec inny czlonek Kapituly.\n");
		return 1;
	}				
	notify_fail("Poprawna skladnia: usun z Zakonu/Rady kto.\n");
}
	
dodaj_prawa_mistrza(string imie)
{
	int i;
	for (i=0;i<=30;i++) PRAWA->dodaj_prawa(i,imie);
	PRAWA->set_mistrz(imie);
}

int
wstap(string str)
{
	string jak;
	if (PRAWA->query_mistrz()==TP->query_real_name())
	{
		notify_fail("Juz jestes Wielkim Mistrzem.\n");
		return 0;
	}
	if (!TP->query_prop(WYBRANY_NA_MISTRZA))
	{
		notify_fail("Musisz zostac wybrany dwiema trzecimi glosow Kapituly"
			+" Zakonnej, zanim bedziesz mogl zasiasc na tronie Wielkiego"
			+" Mistrza.\n");
		return 0;
	}
	if (!str || !(parse_command(str,environment(TP),"'na' 'tron'") || 
		parse_command(str,environment(TP),"%w 'na' 'tron'",jak)))
	{
		notify_fail("Poprawna skladnia brzmi:\n \t\t wstap [jak] na tron\n");
		return 0;
	}
	if (jak)
	{
		write(C(jak)+" wstepujesz na tron Wielkiego Mistrza.\n");
		say (QCIMIE(TP,PL_MIA)+ " "+jak +" wstepuje na tron Wielkiego Mistrza.\n");
	}
	else 
	{
		write("Powoli, z zasluzonym poczuciem dumy wstepujesz na tron Wielkiego Mistrza.\n");
		say (QCIMIE(TP,PL_MIA)+ " powoli, stanowczym krokiem wstepuje na tron Wielkiego Mistrza.\n");
	}
	if (PRAWA->query_mistrz())
	   usun_prawa(PRAWA->query_mistrz());
	PRAWA->usun_z_kapituly(TP->query_real_name());
	dodaj_prawa_mistrza(TP->query_real_name());
	TP->remove_prop(WYBRANY_NA_MISTRZA);
	glosowanie=([]);
	return 1;
}
	

int wygral_glosowanie(object kto)
{
	tell_room(environment(TP)," Slyszysz trumfalne dzwieki trab. "+QCIMIE(kto,PL_MIA) + " zostal wybrany nowym Wielkim Mistrzem Zakonu Rycerskiego Sigmara Mlotodzierzcy.\n", ({kto}));
	kto->add_prop(WYBRANY_NA_MISTRZA,1);
	kto->catch_msg("Slyszysz trumfalne dzwieki trab. Zostales wybrany nowym Wielkim Mistrzem.\n");
}

int
glosuj(string str)
{
	object *kogom, na_kogo;
	string *glosy;
	int i;
	string imie;
	str=L(str);
	if (str!="chwala sigmarowi") //Jak zrobiles lower_case, to pisz malymi
					//literkami
	{
		parse_command(str,environment(TP),"'chwala' %l:"+PL_CEL, kogom);
		kogom=NORMAL_ACCESS(kogom, 0, 0);
		if (!sizeof(kogom)) return notify_fail("Na kogo chcesz glosowac?\n");
		na_kogo=kogom[0];
	}
	else 
	  {na_kogo=TP;}
	  //Ta czesc dziala dobrze
	if (!PRAWA->sprawdz_prawa(GLOSOWANIE_NA_MISTRZA,TP)) 
	{
	   write("Nie masz prawa glosowac na Mistrza.\n");
	   return 1;
	}
	if (!living(na_kogo)) 
	   {
		write("Nie mozesz glosowac na te osobe.\n");
		return 1; //notify_fail nie dziala, bo jak zwracamy 0,
			// to wykonuje sie std. krzyknij
	   }
	if (glosowanie[TP->query_real_name()]) 
	   {
	      write("Juz oddales swoj glos.\n");
	      return 1;
	   }
	imie=na_kogo->query_real_name();
	glosowanie[TP->query_real_name()]=imie;
	glosy=m_values(glosowanie);
	for (i=0;i<sizeof(glosy);i++) 
		if (glosy[i]!=imie) 
			glosy-=({glosy[i]});
	if (sizeof(glosy)==2) set_alarm(0.5,0.0,&wygral_glosowanie(na_kogo));
}
