/* Obiekt administrujacy gildii halflingskiej */
inherit "/d/Imperium/std/room";
   /* Jesli bedzie to pokoj, to bedzie to pomocne, a napewno nieszkodliwe */

#include "halfy.h"
  /* Wszystkie globalne definicje beda tu. */

#define SAVEFILE (EDIR + "gildia")
  /* Musimy przechowywac stan zmiennych. */

mapping czlonkowie=([]);
mapping kandydaci=([]);
mapping wyrzuceni=([]);
string *rada=({});

create_imperium_room()
{
   set_short("Administracja Zgromadzenia Halflingskiego");
   set_long("Administracja Zgromadzenia Halflingskiego.\n");
   
   restore_object(SAVEFILE);
}

/* Jakoze bedziemy wywolywac ten kawalek kodu  w wielu miejscach, 
   zadeklarujmy go jako funkcje. teoretycznie mozna by bylo zachowywanie
   zrobic tylko w remove_object(), ale praktyka podpowiada, ze moze
   np. zostac wylaczony prad, czy inny kataklizm i wtedy... */
save_me()
{
   save_object(SAVEFILE);
}

/* Nazwa mowi sama za siebie. */

int
query_radny(mixed who)
{
   who=M_TO_S(who);
   return member_array(who,rada)+1;
}

string *
query_rada()
{
   return filter(rada,stringp);
}

string *
query_czlonkowie()
{
   return m_indexes(czlonkowie);
}

string *
query_kandydaci()
{
   return m_indexes(kandydaci);
}

int
kto_zaakceptowal(mixed kandydat)
{
   kandydat=M_TO_S(kandydat);
   
   return kandydaci[kandydat];
}

string *
query_wyrzuceni()
{
   return m_indexes(wyrzuceni);
}

string
powod_wyrzucenia(mixed kogo)
{
   kogo=M_TO_S(kogo);
   return wyrzuceni[kogo];
}

nowy_czlonek(mixed kto)
{
   kto=M_TO_S(kto);
   czlonkowie[kto]=1; /* Nie wiem, czy bedzie to potrzebne, ale na wszelki
   			 wypadek robie mappinga. Potem moze zmienie na 
   			 stringa, jesli nic nie wypadnie */
   save_me();
}

int
wyrzucamy(mixed kogo,string powod)
{
   kogo=M_TO_S(kogo);
   if (!czlonkowie[kogo]) return 0; /* Ta osoba nie jest czlonkiem gildii */
   czlonkowie=m_delete(czlonkowie,kogo);
   rada-=({kogo}); /* Moze to byl radny, jesli nie to ta instrukcja nic
   			  nie zrobi, jesli byl, to go wykasuje z rady */
   wyrzuceni[kogo]=powod;
   return 1;
}

int
dodaj_do_rady(mixed kogo)
{
   kogo=M_TO_S(kogo);
   if (!czlonkowie[kogo]) return -1; /* Ktos kto nie jest czlonkiem gildii
   					nie moze byc w radzie */
   if (sizeof(rada)==3) return 0; /* Mamy juz cala rade, najpierw trzeba
   				     kogos z niej usunac */
   rada+=({kogo});
   return 1;
}

int
usun_z_rady(mixed kogo)
{
   kogo=M_TO_S(kogo);
   if (!query_radny(kogo)) return 0; /* On nie jest radnym */
   rada-=({kogo});
//   if (sizeof(rada)<2) rozpocznij_wybory("Automatyczne");
   return 1;
}

int
wybaczamy(mixed komu)
{
   komu=M_TO_S(komu);
   if (!wyrzuceni[komu]) return 0; /* Nie wyrzucalismy go */
   wyrzuceni=m_delete(wyrzuceni, komu);
   return 1;
}