/* 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!!!_"
#define TP this_player()

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");
        add_action("pobierz", "pobierz");
        

}
        

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));
}

int
pobierz(string str)
{
    notify_fail("Co chcesz pobrac?\n");

    if ( str == "mlot" )
    {
        TP->catch_msg("Po chwili brat sluzebny podaje ci mlot.\n");
        tell_room(environment(TP),"Brat sluzenmu podaje " + QCIMIE(TP,PL_CEL) + 
                  " mlot.\n", ({TP}));
        clone_object("/d/Imperium/Altdorf/bronie/framlot.c")->move(TP);
        return 1;
    }

    return 0;
}
