/* To jest obiekt zakonu...
 	Tutaj sprawdza sie, czy ktos moze gdzies wejsc...
 	I wszystkie inne zabezpieczenia... generalnie... To jest taki secure...
 	Odnosi sie do niego przez PRAWA
 	Zabezpieczenia robimy w integerach... bit 1 moze, bit 0 nie.
 	tutaj sprawdzamy jaka kto ma range, jaki wiek...
*/

#pragma no_clone

#include "mith.h" //sciezki
#include "ryc_zak.h"		// plik ze wszystkimi definicjami, prawami 
				// itp. Wszystkie obiekty zakonu go includuja
				// i dzieki temu _powinnismy_ uniknac roznego
				// nazwenictwa etc.

inherit "/d/Imperium/std/room";

#define PRAWO 0
#define RANGA 1
#define WIEK 2


mapping spis=([]);
string *kapitula=({0,0,0,0});
mapping zabite_npce=([]);
string *usunieci=({});

create_imperium_room()
{
	setuid();
	seteuid(getuid());
	restore_object(ENGINE+"zakon");
}

remove_object()
{
	rm(ENGINE + "zakon.o");
	save_object(ENGINE+"zakon");
	::remove_object();
}

zniszcz()
{
	destruct();
}

string
query_urzednik(int urzad)
{
	return kapitula[urzad];
}

int
query_urzad(string urzednik)
{
	return member_array(urzednik,kapitula);
}
	
usun_z_kapituly(string urzednik)
{
	int n=member_array(urzednik,kapitula);
	if (n!=-1) kapitula[n]=-1;
}


set_mistrz(string imie)
{
	kapitula[MISTRZ]=imie;
}

string
query_mistrz()
{
	return kapitula[MISTRZ];
}

int 
test_bit(int zapis, int numer)
{
	int tmp;
	tmp=zapis>>numer-1; // liczba, ktorej ostatni bit zawiera szukana wartosc;
	return !(tmp/2*2==tmp); // zwraca 0 dla parzystych, 1 dla nieparzystych.
}

int 
set_bit(int zapis, int numer)
{
	if (test_bit(zapis,numer)) return zapis; // jesli juz jest, to nie zmienia;
	return zapis + ftoi(pow(2.0,itof(numer-1))); // dodaje odpowiednia lcizbe.
}

int 
clear_bit(int zapis, int numer)
{
	if (!test_bit(zapis,numer)) return zapis; // jesli nie ma, to nie zmienia
	return zapis-ftoi(pow(2.0,itof(numer-1))); // odejmuje odpowiednia liczbe.
	
}
	
rejestruj(mixed komu)
{
	string imie = stringp(komu) ? komu : komu->query_real_name();
	mixed *tabl=allocate(3);
	if (member_array(imie,m_indices(spis))==-1)
		spis[imie]=tabl;
	if (!spis[imie][WIEK]) 
		spis[imie][WIEK]=find_player(imie)->query_age();
}
	

dodaj_prawa(int numer_pokoju, mixed komu)
{
	string imie = stringp(komu) ? komu : komu->query_real_name();
	int tmp;
	rejestruj(imie);
	tmp=spis[imie][PRAWO];
	if (test_bit(tmp, numer_pokoju)) return;
        spis[imie][PRAWO] = set_bit(tmp, numer_pokoju);
        return spis[imie][PRAWO];
}
	

int
sprawdz_prawa(int numer_pokoju, mixed komu)
{
	string imie = stringp(komu) ? komu : komu->query_real_name();
	if (find_player(imie)->query_guild_name_occ()!=GUILD_NAME && !find_player(imie)->query_wiz_level()) return 0;
	rejestruj(imie);
	return (test_bit(spis[imie][PRAWO], numer_pokoju));
}

usun_prawa(int numer_pokoju, mixed komu)
{
	string imie = stringp(komu) ? komu : komu->query_real_name();
	int tmp;
	rejestruj(imie);
	tmp = spis[imie][PRAWO];
	if (!test_bit(tmp, numer_pokoju)) return;
	if (numer_pokoju==CZLONEK_RADY) usun_z_kapituly(imie);
	return spis[imie][PRAWO] = clear_bit(tmp, numer_pokoju);
}


string
mianuj(string urzednik, int urzad)
{
	kapitula[urzad]=urzednik;
	switch(urzad)
	{
		case MISTRZ:
			dodaj_prawa(BIBLIOTEKA ,urzednik);
			dodaj_prawa(BLOGOSLAWIENIE_NA_BRATA_ZAKONNEGO ,urzednik);
                        dodaj_prawa(OTWIERANIE_SKRZYNI ,urzednik);
                        dodaj_prawa(WIELKI_MISTRZ ,urzednik);
                        break;
                case MARSZALEK:
                        dodaj_prawa(BLOGOSLAWIENIE_NA_BRATA_SLUZEBNEGO ,urzednik);
                        break;
		case SZATNY:
			dodaj_prawa(BIBLIOTEKA ,urzednik);
			break;
	}
        dodaj_prawa(GLOSOWANIE_NA_MISTRZA ,urzednik);
        dodaj_prawa(PRAWA_BRATA ,urzednik);
        dodaj_prawa(PRAWA_RYCERZA ,urzednik);
        dodaj_prawa(PODANIA ,urzednik);
        dodaj_prawa(CZLONEK_RADY ,urzednik);
                                                                                                                               
}	


int
query_ranga(mixed komu)
{	
	string imie = stringp(komu) ? komu : komu->query_real_name();
	rejestruj(imie);
	if (query_urzad(imie)>-1) return 9;
	return spis[imie][RANGA];
}

int
set_ranga(mixed komu, int jaka=-1)
{
	string imie = stringp(komu) ? komu : komu->query_real_name();
	rejestruj(imie);
	komu=find_player(imie);
	(jaka==-1) ? spis[imie][RANGA]++ : (spis[imie][RANGA]=jaka);
	if (spis[imie][RANGA]>komu->query_guild_rank_occ())
	{
		return spis[imie][RANGA]=komu->query_guild_rank_occ();
	}
	return spis[imie][RANGA];
}

int
query_wiek(mixed komu)
{
	 string imie = stringp(komu) ? komu : komu->query_real_name();
	 rejestruj(imie);
	 return find_player(imie)->query_age()-spis[imie][WIEK];
}

/* Ta funkcja ustawia standardowe prawa brata zakonnego. Na razie to tylko 
	PRAWA_RYCERZA, ale w przyszlosci moze byc ich wiecej. */

dodaj_prawa_brata_zakonnego(string imie)
{
	dodaj_prawa(PRAWA_RYCERZA,imie);
}

notify_zabil_npca(object kto, object kogo)
{
	 string imie = stringp(kto) ? kto : kto->query_real_name();
	 (zabite_npce[imie]) ? (zabite_npce[imie]+=({MASTER_OB(kogo)})) :
	 	 (zabite_npce[imie]=({MASTER_OB(kogo)}));
}

string *
query_zabite_npce(mixed kto)
{
    string imie = stringp(kto) ? kto : kto->query_real_name();
	return zabite_npce[imie];
}

usun(mixed str)
{
	object kogo=((objectp(str))?(str):(find_player(str)));
	str=kogo->query_real_name();
	if (kogo)
	{
		if (kogo->wyrzucmy_go(kogo))
		{	
			spis=m_delete(spis,str);
			kogo->catch_msg("Zostales usuniety z grona Braci Zakonnych Zakonu Rycerskiego Sigmara Mlotodzierzcy.\n");
			write_file(LOG,C(str)+" usuniety. "+ctime(time())+"\n");
		}
		else
		{
			write_file(LOG,C(str)+" nie moze zostac usuniety.\n"+ctime(time())+"\n");
			kogo->catch_msg("Wystapil powazny blad. Zglos sie do Wielkiego Mistrza.\n");
		}			
	}
	else
	{
		usunieci+=({str});
	}
}

int
trzeba_usunac(string imie)
{
	if (member_array(imie, usunieci)==-1) return 0;
	usun(imie);
	usunieci-=({imie});
	return 1;
}	

pokaz(string kogo)
{
	write(spis[kogo][PRAWO]);
}
