/*
 * Obiekt administracyjny dla Miecznikow jakichstam
 * napisany przez Morleya w '99
 * opis funkcji znajduje sie w pliku admin_ob_opis
 */
#pragma no_clone
#pragma save_binary

#include "miecznicy.h"

inherit "/std/object";

string *miecznicy = ({ });
string *sztab = ({ });
string kapitan = "";
mapping st_miecznikow = ([ ]);
string *locked_specials = ({ });
string *locked_trainings = ({ });
mapping wyrzuceni = ([ ]);
mixed glosowania = ({ });
mapping odznaczenia = ([ ]);
mixed oczekujace_odz = ({ });
int nr_glosowania;

int query_stopien(mixed ob);
void cleanup();

void
create_object()
{
    setuid();
    seteuid(getuid());
	
    if (file_size(SAVE + ".o") >= 0)
	restore_object(SAVE);

    if (!random(30))
	set_alarm(3600.0, 0.0, cleanup);
}

void
nagraj()
{
    save_object(SAVE);
}

void
remove_object()
{
    save_object(SAVE);
    ::remove_object();
}

void
cleanup()
{
    // WYBITNIE ciekawa funkcja w chwili obecnej :P
}

int
query_miecznik(mixed ob)
{
    if (member_array(ob, miecznicy) == -1)
	return 0;
    
    return 1;
}

int
query_sierzant(mixed ob)
{
    if (query_stopien(ob) >= ST_SIERZANT)
	return 1;
    
    return 0;
}

int
query_porucznik(mixed ob)
{
    if (query_stopien(ob) >= ST_PORUCZNIK)
	return 1;
    
    return 0;
}

int
query_kapitan(mixed ob)
{
    if (query_stopien(ob) == ST_KAPITAN)
	return 1;

    return 0;
}

int
query_stopien(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    return st_miecznikow[ob];
}

int
query_sztab_mem(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if ( (member_array(ob, sztab) != -1) || (ob == kapitan) )
	return 1;

    return 0;
}

mixed
query_wladze()
{
    mixed wladze = allocate(2);

    wladze[0] = kapitan;
    wladze[1] = sztab;

    return wladze;
}

int
compare_stopien(mixed m1, mixed m2)
{
    m1 = query_stopien(m1);
    m2 = query_stopien(m2);

    if (m1 == m2)
	return 0;

    if (m1 > m2)
	return 1;

    return 2;
}

int
no_special(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (member_array(ob, locked_specials) != -1)
	return 1;

    return 0;
}

int
lock_special(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (no_special(ob))
	return 0;

    locked_specials += ({ ob });
    nagraj();
    return 1;
}

int
unlock_special(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (!no_special(ob))
	return 0;

    locked_specials -= ({ ob });
    nagraj();
    return 1;
}

int
no_training(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (member_array(ob, locked_trainings) != -1)
	return 1;

    return 0;
}

int
lock_training(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (no_training(ob))
	return 0;

    locked_trainings += ({ ob });
    nagraj();
    return 1;
}

int
unlock_training(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (!no_training(ob))
	return 0;

    locked_trainings -= ({ ob });
    nagraj();
    return 1;
}

void
dodaj_miecznika_service(string miecznik)
{
    miecznicy += ({ miecznik });
    st_miecznikow[miecznik] = ST_ZOLNIERZ;
    nagraj();
}

int
usun_miecznika_service(string miecznik)
{
    miecznicy -= ({ miecznik });
    locked_trainings -= ({ miecznik });
    locked_specials -= ({ miecznik });
    sztab -= ({ miecznik });
    if (kapitan == miecznik)
	kapitan = "";
    st_miecznikow = m_delete(st_miecznikow, miecznik);
    odznaczenia = m_delete(odznaczenia, miecznik);

    /*
     * To jest nieskonczone! :) SPOJRZ TU MORI KONIECZNIE NASTEPNYM RAZEM!
     */
    nagraj();
}

string*
query_miecz_list()
{
    return miecznicy;
}

string*
query_zoln_list()
{
    int i, tmp = sizeof(miecznicy);
    string *matching = ({ });

    for (i = 0; i < tmp; i++)
	if (query_stopien(miecznicy[i]) == ST_ZOLNIERZ)
	    matching += ({ miecznicy[i] });
    
    return matching;
}

string*
query_sierz_list()
{
    int i, tmp = sizeof(miecznicy);
    string *matching = ({ });

    for (i = 0; i < tmp; i++)
	if (query_stopien(miecznicy[i]) == ST_SIERZANT)
	    matching += ({ miecznicy[i] });
    
    return matching;
}

string*
query_porucz_list()
{
    int i, tmp = sizeof(miecznicy);
    string *matching = ({ });

    for (i = 0; i < tmp; i++)
	if (query_stopien(miecznicy[i]) == ST_PORUCZNIK)
	    matching += ({ miecznicy[i] });
    
    return matching;
}

string
query_kapitan_list()
{
    return kapitan;
}

int
set_zolnierz(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (query_stopien(ob) == ST_ZOLNIERZ)
	return 0;

    st_miecznikow[ob] = ST_ZOLNIERZ;
    nagraj();
    return -1;
}

int
set_sierzant(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (query_stopien(ob) == ST_SIERZANT)
	return 0;

    if (query_stopien(ob) > ST_SIERZANT)
    {
	st_miecznikow[ob] = ST_SIERZANT;
	nagraj();
	return -1;
    }

    st_miecznikow[ob] = ST_SIERZANT;
    nagraj();
    return 1;
}

int
set_porucznik(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (query_stopien(ob) == ST_PORUCZNIK)
	return 0;

    if (query_stopien(ob) > ST_PORUCZNIK)
    {
	st_miecznikow[ob] = ST_PORUCZNIK;
	nagraj();
	return -1;
    }

    st_miecznikow[ob] = ST_PORUCZNIK;
    nagraj();
    return 1;
}

int
set_kapitan(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (query_stopien(ob) == ST_KAPITAN)
	return 0;

    if (kapitan != "")
	return -1;

    st_miecznikow[ob] = ST_KAPITAN;
    kapitan = ob;
    nagraj();
    return 1;
}

int
set_sztab_member(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (member_array(ob, sztab) != -1)
	return 0;

    if (sizeof(sztab) == WIELKOSC_SZTABU)
	return -1;

    sztab += ({ ob });
    nagraj();
    return 1;
}

int
remove_sztab_member(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (member_array(ob, sztab) == -1)
	return 0;

    sztab -= ({ ob });
    /*
     * URUCHOMIC PROCEDURY DO GLOSOWANIA!
     * hmmm nie :) to zrobie w nagraj :P
     */
    nagraj();
    return 1;
}

void
dodaj_odznaczenie(mixed ob, int nr)
{
    mapping tmp;
    if (objectp(ob))
	ob = ob->query_real_name();

    if (mappingp( odznaczenia[ob] ) )
	tmp = odznaczenia[ob];
    else
	tmp = ([ ]);

    tmp[nr] = tmp[nr] + 1;

    odznaczenia[ob] = tmp;
    nagraj();
}

int
usun_odznaczenie(mixed ob, int nr)
{
    mapping tmp;
    if (objectp(ob))
	ob = ob->query_real_name();

    if (mappingp( odznaczenia[ob] ) )
	tmp = odznaczenia[ob];
    else
        return 0;

    if (tmp[nr] <= 0)
	return 0;

    tmp[nr] = tmp[nr] - 1;

    if (tmp[nr] == 0)
	tmp = m_delete(tmp, nr);

    if (!sizeof( m_indexes(tmp) ) )
    {
	odznaczenia = m_delete(odznaczenia, ob);
	nagraj();
	return 1;
    }

    odznaczenia[ob] = tmp;
    nagraj();
    return 1;
}

mapping
query_odznaczenia(mixed ob)
{
    if (objectp(ob))
	ob = ob->query_real_name();

    if (mappingp (odznaczenia[ob]))
	return odznaczenia[ob];

    return ([ ]);
}
