/*
 *		Naszyjnik dla zabojcow {trolli, gigantow, smokow, demonow}.
 *
 *		Napisal : Mithandir ... 1998
 *
 */
 
inherit "/std/object.c";
inherit "/cmd/std/command_driver";

#include "morley.h"
#include <formulas.h>

#include "zabojcy.h";

#pragma no_inherit

void setup_naszyjnik();
string q_master(object ob);

static object my_owner;

static int jaki_zabojca;
static int zalozony=0;
static object *zaatakowani;

void
create_object()
{
    ustaw_nazwe (({"naszyjnik","naszyjnika","naszyjnikowi","naszyjnik",
		       "naszyjnikiem","naszyjniku"}),
		 ({"naszyjniki","naszyjnikow", "naszyjnikom","naszyjniki",
		       "naszyjnikami","naszyjnikach"}),
		PL_MESKI_NZYW);

    add_prop (OBJ_I_WEIGHT, 300);
    add_prop (OBJ_I_VALUE, 0);
    add_prop (OBJ_I_NO_DROP, "Nie mozesz wyrzucic naszyjnika. Jesli "+
	      "chcesz sie go pozbyc, mozesz go zniszczyc.\n");

    setuid();
    seteuid(getuid());
}

int
usun_propy()
{
	remove_prop(OBJ_I_NO_DROP);
}

int
dodaj_propy()
{
	add_prop (OBJ_I_NO_DROP, "Nie mozesz wyrzucic naszyjnika. Jesli "+
		"chcesz sie go pozbyc, mozesz go zniszczyc.\n");
}


void
setup_naszyjnik()
{
    string przydawka, tmp;
    int przyp;
    string *shortyp = ({});
    string *shortym = ({});
    
    my_owner = environment();
    if (!interactive(my_owner))
	remove_object();

    jaki_zabojca = ADMIN_OB->zabojca(my_owner);

    przydawka = CZEGO_LM[PL_DOP][jaki_zabojca];

    while (przyp <= PL_MIE)
    {
	tmp = query_name(0, przyp) + " zabojcy " + przydawka;
	shortyp += ({tmp});
	tmp = query_pname(0, przyp++) + " zabojcow " + przydawka;
	shortym += ({tmp});
    }

    ustaw_shorty(shortyp, shortym, PL_MESKI_NZYW);
    add_prop (OBJ_I_VALUE, 240+240*10*jaki_zabojca);
    set_long("Jest to przepiekny "+short(PL_MIA)+" wykonany "+
	     WYKONANY[jaki_zabojca]+". Znac na nim slady mistrzowskiej roboty "+
	     "krasnoludzkich zlotnikow. Taki naszyjnik wykonany mogl zostac "+
	     "tylko w ktorejs z twierdz krasnoludzkich. Jest on symbolem "+
	     "przynaleznosci do Zabojcow "+
	     capitalize(CZEGO_LM[PL_DOP][jaki_zabojca])+".\n");
    update_actions();
}	
	
	

int
zniszcz(string str)
{
    if (str!="naszyjnik")
	return notify_fail("Co chcesz zniszczyc?\n");
    
    if (this_player()->query_real_name() == ADMIN_OB->query_szef())
    {
	write("Najpierw musisz przekazac komus wladze nad Zabojcami, dopiero " +
	      "potem bedziesz mogl ich opuscic.\n");
	return 1;
    }

    ADMIN_OB->usun(this_player()->query_real_name());

    write("Niszczysz naszyjnik. Od tej pory nie jestes juz Zabojca.\n");

    this_player()->clear_bit(1,0);

    say(QCIMIE(TP, PL_MIA)+" niszczy naszyjnik Zabojcy.\n");
    set_alarm(0.01, 0.0, remove_object);
    return 1;
}

int
wear(string co)
{
    notify_fail("Co chcesz zalozyc?\n");
    if (co!="naszyjnik") return 0;
    if (!ADMIN_OB->zatwierdzony(my_owner))
    {
    	notify_fail("Nie odwazysz sie zalozyc naszyjnik Zabojcow przed oficjalnym " +
		    "przyjeciem przez ich oficjalnego zwierzchnika.\n"); 
    	return 0;
    }

    write("Zakladasz na szyje " + short(PL_BIE) + ".\n");
    say(QCIMIE(TP,PL_MIA)+" zaklada na szyje " + short(PL_BIE) + ".\n");
    move(TP, ZABOJCY_SUBLOC);
    zalozony = 1;
    update_actions();
    return 1;
}

int
remove(string co)
{
    notify_fail ("Co chcesz zdjac?\n");
    if (co != "naszyjnik") 
	return 0;
    
    write("Zdejmujesz " + short(PL_BIE) + ".\n");

    say(QCIMIE(TP, PL_MIA) + " zdejmuje " + short(PL_BIE) + ".\n");

    zalozony=0;
    move(TP);
    update_actions();
    return 1;
}

int
przekaz(string str)
{
    object *komu;
    NO_STR("Poprawna skladnia: przekaz wladze <komu>.\n");
    komu = parse_this(str, "'wladze' %l:"+PL_CEL);

    if (sizeof(komu)!=1)
	return notify_fail("Komu chcesz przekazac wladze nad Zabojcami?\n");
    
    if (!ADMIN_OB->zatwierdzony(komu[0]))
    {
	notify_fail("Wladze mozesz przekazac tylko zatwierdzonemu czlonkowi " +
		    "Zabojcow.\n");
	return 0;
    }

    target("wyciaga rece w twoja strone, przekazujac ci blogoslawienstwo "+
	   "Throrina i wladze nad Zabojcami.", komu);
    actor("Wyciagasz rece w kierunku",komu, PL_DOP," przekazujac "+
	  komu[0]->koncowka("mu","jej")+" blogoslawienstwo Throrina i wladze "+
	  "nad Zabojcami.");
    all2act("wyciaga rece w kierunku",komu, PL_DOP," szepczac "+
	    "niezrozumiale dla ciebie slowa blogoslawienstwa.");

    ADMIN_OB->set_szef(komu[0]);

    update_actions();
    return 1;
}
	
int
przyjmij(string str)
{
    object kogo, *ktosie;
    NO_STR("Poprawna skladnia: przyjmij do zabojcow <kogo>.\n");
    ktosie = parse_this(str, "'do' 'zabojcow' %l:"+PL_BIE);

    if (sizeof(ktosie)!=1)
	return notify_fail("Kogo chcesz przyjac do zabojcow?\n");

    kogo = ktosie[0];
    if (!(kogo->query_subloc_obj(ZABOJCY_SUBLOC)))
	return notify_fail(kogo->query_Imie(TP, PL_MIA)+" musi miec zalozony "+
			   "naszyjnik zabojcy.\n");

    // KLUB  
    if(kogo->test_bit("imperium",1,0))
    {
	kogo->catch_msg("Nie mozesz przylaczyc sie do tego klubu, jestes juz bowiem "+
			"w innym.\n");
	return notify_fail(kogo->query_Imie(TP, PL_MIA)+" nie moze zostac Zabojca!\n");
    }
    
    if (ADMIN_OB->zatwierdzony(kogo))
	return notify_fail(kogo->query_Imie(TP, PL_MIA)+" juz jest Zabojca!\n");

    ADMIN_OB->zatwierdz(kogo);

    TP->catch_msg("Wyciagasz rece w kierunku",ktosie, PL_DOP," blogoslawiac "+
		  kogo->koncowka("go","ja")+" w imieniu Throrina.\n");
    target("wyciaga rece w twoim kierunku, blogoslawiac cie w imieniu Throrina.", ktosie);
    all2act("wyciaga rece w kierunku", ktosie, PL_DOP, " blogoslawiac " +
	    ktosie[0]->koncowka("go","ja") + " w imieniu Throrina.");

    return 1;
}

int
wyrzuc(string str)
{
    object kogo, *oblist;
    string imie, *obiekty;
    int a;

    NO_STR("Poprawna skladnia:\nWyrzuc <kogo> z zabojcow (wyrzucany musi byc widziany)\n" +
	   "lub:\nWyrzuc <imie w mianowniku> z zabojcow (wyrzucany nie musi byc zalogowany)\n");

    oblist = parse_this(str, "%l:" + PL_DOP + " 'z' 'zabojcow'");
    
    if (sizeof(oblist) != 1)
	notify_fail("Wyrzucic kogo z zabojcow?\n");

    if (sizeof(oblist) == 0)
    {
	sscanf(str, "%s z zabojcow", imie);
	if (stringp(imie))
	    if (ADMIN_OB->zatwierdzony(imie))
	    {
		if (imie == this_player()->query_real_name())
		{
		    notify_fail("W ten sposob nie mozesz wyrzucic sam" + 
				this_player()->koncowka("", "a") + " siebie. Przekaz " +
				"wladze i uzyj komendy zniszcz.\n");
		    return 0;
		}
		    
		ADMIN_OB->usun(imie);
		write(capitalize(imie) + " od tej chwili nie nalezy do Zabojcow.\n");
		if(find_player(imie))
		{
		    object *invent = deep_inventory(find_player(imie));
		    invent->update_actions();
		}
	    }

	return 0;
    }

    kogo = oblist[0];

    if (!ADMIN_OB->zatwierdzony(oblist[0]))
    {
	notify_fail(kogo->query_Imie(this_player(), PL_MIA) + " nie nalezy do Zabojcow!\n");
	return 0;
    }
    
    ADMIN_OB->usun(kogo->query_real_name());
    
    oblist = deep_inventory(kogo);
    obiekty = map(oblist, q_master);
    
    a = member_array(MASTER, obiekty);
	    
    write("Z pogarda wyrywasz " + oblist[a]->short(this_player(), PL_BIE) + " " +
	  kogo->query_imie(this_player(), PL_CEL) + " i ze zloscia wdeptujesz go w ziemie, " +
	  "dajac wszystkim do zrozumienia, ze " + kogo->query_imie(this_player(), PL_MIA) + 
	  " nie nalezy juz do Zabojcow.\n");

    say(QCIMIE(this_player(), PL_MIA) + " z pogarda wyrywa " + 
	QSHORT(oblist[a], PL_BIE) + " " + QIMIE(kogo, PL_CEL) + " i wdeptuje go ze zloscia " +
	"w ziemie, dajac wszystkim do zrozumienia, ze " + QIMIE(kogo, PL_MIA) + " nie " +
	"nalezy juz do Zabojcow.\n", ({this_player(), kogo}));

    kogo->catch_msg(QCIMIE(this_player(), PL_MIA) + " z pogarda wyrywa ci " + 
		    QSHORT(oblist[a], PL_BIE) + " i ze zloscia wdeptuje go w ziemie " +
		    "dajac ci do zrozumienia, ze juz nie nalezysz do Zabojcow.\n");

    oblist[a]->remove_object();

    return 1;
}

string
q_master(object ob)
{
    return MASTER_OB(ob);
}

void
init()
{
    ::init();

    add_action(zniszcz,"zniszcz");

    if (zalozony) 
	add_action(remove,"zdejmij");
    else 
	add_action(wear,"zaloz");

    if (my_owner->query_real_name() == ADMIN_OB->query_szef())
    {
    	add_action(przekaz,"przekaz");
    	add_action(przyjmij,"przyjmij");
	add_action(wyrzuc, "wyrzuc");
    }
    
    if (ADMIN_OB->zatwierdzony(this_player()))
    	init_emoty();
}

void
leave_env(object from, object to)
{
    from->remove_subloc(ZABOJCY_SUBLOC);
    ::leave_env(from, to);
}

void
enter_env(object dest, object old)
{
    ::enter_env(dest, old);

    if (interactive(old))
   	remove_object();	
    if (!interactive(dest))
	remove_object();
    
    dest->add_subloc(ZABOJCY_SUBLOC, this_object());
    set_alarm(0.5, 0.0, setup_naszyjnik);
}     

string
show_subloc(string subloc, object on_obj, object for_obj)
{
    string str = "";
    object *oblist, bron;
    int tmp, a;
    
    if(!ADMIN_OB->zatwierdzony(on_obj))
	return "";
    
    switch(subloc)
    {
    case ZABOJCY_SUBLOC:
	if (on_obj == for_obj)
	{
	    if (zalozony)
	    {
		str += "Na szyi nosisz "+short(PL_BIE)+", wykonany z oprawionych w kosztowny " +
		    "kruszec zebow "+CZEGO_LP[PL_BIE][jaki_zabojca];
		if (on_obj->query_prop(TEMP_SUBLOC_SHOW_ONLY_THINGS))
		    str += ".\n";
		else
		    str += ", a twoja twarz zdobia charakterystycznie wytatuowane mistyczne " +
			"spiralne wzory.\n";
		return str;
	    }
	    else
	    {
		if (on_obj->query_prop(TEMP_SUBLOC_SHOW_ONLY_THINGS))
		    return "";
		return "Twoja twarz zdobia charakterystycznie wytatuowane mistyczne spiralne " +
		    "wzory.\n";
	    }
	}
	else
	{
	    if (zalozony)
	    {
		return "Na szyi nosi "+short(PL_BIE)+", wykonany z oprawionych w kosztowny " +
		    "kruszec zebow "+CZEGO_LP[PL_BIE][jaki_zabojca] + ", a " +
		    on_obj->koncowka("jego", "jej", "jego") + " twarz zdobia " +
		    "charakterystycznie wytatuowane mistyczne spiralne wzory.\n";
	    }
	    else 
	    {
		return on_obj->koncowka("Jego", "Jej", "Jego") + " twarz zdobia " +
		    "charakterystycznie wytatuowane mistyczne spiralne wzory.\n";
	    }
	}
	break;

    case TOP_SUBL:
	oblist = all_inventory(on_obj);
	a = sizeof(oblist);
	for (tmp = 0; tmp < a; tmp++)
	{
	    if (oblist[tmp]->query_subloc() == TOP_SUBL)
	    {	
		bron = oblist[tmp];
		break;
	    }
	}
	if (!objectp(bron))
        {
            for_obj->remove_subloc(TOP_SUBL);
            return "";
        }

	if (for_obj == on_obj)
	    return "Przez plecy masz przewieszony " + bron->short(for_obj, PL_BIE) + ".\n";
	else
	    return "Przez plecy ma przewieszony " + bron->short(for_obj, PL_BIE) + ".\n";
	break;

    default:
	return "";
    }    	
}


string 
query_auto_load()
{
    if (my_owner->query_hp() || my_owner->query_real_name() == ADMIN_OB->query_szef())
	return MASTER_OB(this_object());

    ADMIN_OB->usun(my_owner->query_real_name());
    return 0;
}


