
#define NO_STR(a)  if (!str) return notify_fail(a)
#define STR	if (str) return notify_fail("To polecenie nie przyjmuje zadnych argumentow.\n")
#define IMIE_NIC(ob) "@@imie_lub_nic:" + MASTER + "|" + ob->query_real_name() + "@@"
string
comp_zaimki(object *kogo, int przyp, int krotki=0)
{
    string *zaimki = ({"oni","ich","im","ich","nimi","nich"});
    int i;
	
    if (sizeof(kogo)==1)
    {
	return kogo[0]->query_zaimek(przyp, krotki);
    }
    if (!krotki && przyp==PL_BIE) return zaimki[przyp];
    switch (przyp)
    {
    case PL_MIA:
	for (i=sizeof(kogo)-1;i>=0;i--)
	{ 
	    if (kogo[i]->query_gender()==0)
	    {
		return zaimki[przyp];
	    }
	}
	return "one";
    case PL_BIE:
	for (i=sizeof(kogo)-1;i>=0;i--)
	{ 
	    if (kogo[i]->query_gender()==0)
	    {
		return zaimki[przyp];
	    }
	}
	return "je";
    default:
	return zaimki[przyp];
    }
}

string
zaimki_dz(object co, int przyp)
{
    mixed *meskie=({"swoj","swojego","swojemu","swoj","swoim","swoim"}),
	*zenskie=({"swoja","swojej","swojej","swoja","swoja","swojej"});
	
	return co->koncowka(meskie[przyp], zenskie[przyp]);
}

mixed  
query_bron(int przyp=0)
{
    object miecz;
    string opis;
    string rodzaj;
    miecz=(this_player()->query_weapon(W_RIGHT) || 
	   this_player()->query_weapon(W_LEFT) || this_player()->query_weapon(W_BOTH));
    if (!miecz || miecz->query_wt() != W_AXE ) 
	return 0;
    opis=miecz->short(przyp);
    return ({miecz, opis, zaimki_dz(miecz, przyp)});
}
	
string
swoj(int przyp=PL_NAR)
{
    mixed bron=query_bron(przyp);
    if (!bron) 
    {
	notify_fail("Musisz dzierzyc topor, aby moc to zrobic!\n");
	return 0;
    }
    return bron[2]+" "+bron[1];
}

void
powiedz_okolicy(object ob, string str)
{
    string *pokoje = environment(ob)->query_exit_rooms();
    int a = sizeof(pokoje), tmp;

    if (!a)
	return;

    for (tmp = 0; tmp < a; tmp++)
	tell_room(pokoje[tmp], str);
}

string
imie_lub_nic(string imie)
{
     if(pointerp(previous_object(-1)->query_met(imie)))
	return capitalize(find_player(imie)->query_imie(previous_object(-1), PL_DOP));
    
    return "";
}

int
zatak(string str)
{
    object *kogo;
    mixed no_attack;
    
    if (!swoj()) return 0;
    
    if (!str)
    {
   	all("zaczyna krecic mlynce "+swoj()+" przygotowujac sie do ataku.");
   	write("Zaczynasz krecic mlynce "+swoj()+" przygotowujac sie do ataku.\n");
   	return 1;
    }

    kogo=parse_this(str,"%l:"+PL_BIE);
    if (!sizeof(kogo))
   	return notify_fail("Kogo chcesz zaatakowac?\n");
    if (sizeof(kogo)>1)
   	return notify_fail("Kogo dokladnie chcesz zaatakowac?\n");
    if (!F_DARE_ATTACK(TP, kogo[0]))
   	return notify_fail("Nie odwazysz sie na to.\n");

    no_attack=kogo[0]->query_prop(OBJ_M_NO_ATTACK);

    if (!no_attack) no_attack=environment(TP)->query_prop(ROOM_M_NO_ATTACK);
    if (no_attack)
    {
   	if (stringp(no_attack))
	    write(no_attack);
   	else write("Nie mozesz zaatakowac "+kogo[0]->query_imie(TP, PL_BIE)+"\n");
   	return 1;
    }

    if (this_player()->query_met(kogo[0]) && 
	this_player()->query_prop(LIVE_O_LAST_KILL) != kogo[0])
    {
	write("Zabic " + kogo[0]->query_imie(this_player(), PL_BIE) + "?!? Potwierdz " +
	      "to przez ponowne zaatakowanie.\n");
	this_player()->add_prop(LIVE_O_LAST_KILL, kogo[0]);
	return 1;
    }

    this_player()->reveal_me();

    actor("Z okrzykiem \"T H R O R I N!!!\" na ustach, krecac ogromne mlynce " + swoj() +
	  " i toczac wsciekla piane z ust, rzucasz sie na", kogo, PL_BIE);
    all2act("z okrzykiem \"T H R O R I N!!!\" na ustach, krecac ogromne mlynce " + swoj() +
	    " i toczac wsciekla piane z ust, rzuca sie na", kogo, PL_BIE);
    target("z okrzykiem \"T H R O R I N!!!\" na ustach, krecac ogromne mlynce " + swoj() +
	   " i toczac wsciekla piane z ust, rzuca sie na ciebie.", kogo);

    powiedz_okolicy(this_player(), "Z oddali dobiega cie wsciekly krzyk " + 
		    IMIE_NIC(this_player()) + ": \"T H R O R I N!!!\" i chwile pozniej " +
		    "odglosy jakiejs zazartej potyczki.\n");
    TP->attack_object(kogo[0]);
    return 1;
}

int
zokrzyk(string str)
{
    STR;
    all("wydaje z siebie potworny, zadny krwi krzyk THRORIN !!!\nSlyszac ten krzyk " +
	"wzdrygasz sie i masz ochote zatkac uszy.\n");
    write("Wydajesz z siebie potworny, zadny krwi okrzyk THRORIN !!!\n");

    powiedz_okolicy(this_player(), "Z oddali dobiega cie potworny, zadny krwi krzyk " + 
		    IMIE_NIC(this_player()) + ": THRORIN!!!\nSlyszac ten " +
		    "wrzask mimowolnie wzdrygasz sie i masz ochote zatkac uszy.\n");

    return 1;
}

int
zczysc(string str)
{
    string opis=swoj(PL_BIE);
    STR;
    if (!opis)
	return notify_fail("Musisz dzierzyc mlot lub topor, aby moc to zrobic!\n");
    all("szybkim ruchem reki czysci " + swoj(PL_BIE) + "z zakrzeplej krwii przeciwnikow.");
    write("Szybkim ruchem reki czyscisz " + swoj(PL_BIE) + " z zakrzeplej krwii przeciwnikow.\n");
    return 1;
}

int
zzapasc(string str)
{
    STR;
    all("pochyla nisko glowe, i rozglada sie na boki z dzikim spojrzeniem. Jego oczy staja sie niespokojnie zimne, wrecz wrogie. Masz nieodparta chec usunac mu sie z drogi.");
    write("Gdy patrzysz na wszystkich dookola ciebie, powracaja stare wspomnienia. Czego oni chca od ciebie, dlaczego sie tak patrza ?\n");
    return 1;
}

int
zzamierz(string str)
{
    object *oblist;
    
    NO_STR("Poprawna skladnia: zzamierz sie na <kogo>.\n"); 
    if (!swoj()) 
   	return 0;
    oblist = parse_this (str, "'sie' 'na' %l:"+PL_BIE);
    if(sizeof(oblist)==0)
   	return notify_fail("Na kogo chcesz sie zamierzyc?\n");
    if (sizeof(oblist) > 1)
   	return notify_fail("Na kogo dokladnie chcesz sie zamierzyc?\n");

    target("zwinnie przerzuca "+swoj(PL_BIE)+" nad ramieniem, biorac szeroki zamach i mierzac w ciebie! W ostatniej chwili kieruje ostrze w ziemie tuz kolo twoich nog!", oblist);
    all2act("zwinnie przerzuca "+swoj(PL_BIE)+" nad ramieniem, biorac szeroki zamach i mierzac w",oblist,PL_BIE,"! W ostatniej chwili kieruje ostrze w ziemie tuz kolo "+comp_zaimki(oblist, PL_DOP)+" nog!");
    actor("Sapiac lekko bierzesz szeroki zamach "+swoj(PL_NAR)+" na",oblist, PL_BIE," i z msciwa satysfakcja w ostatniej chwili omijasz go ostrzem.");
   
    return 1;
}

int
zspojrz(string str)
{
    object *oblist;

    if (!str)
    {
	allbb("Przesuwa wzrokiem po wszystkich obecnych. Czujesz jak na widok jego zimnych oczu, w ktorych widac lekcewazenie i pozadanie smierci, ogarnia cie przerazenie.");
	write("Przesuwasz wzrokiem po wszystkich obecnych.\n");
	return 1;
    }
    oblist = parse_this (str,"'na' %l:"+PL_BIE);

    if(sizeof(oblist)!=0)
    {
	target("podnosi na ciebie wzrok. Czujesz, jak na widok jego zimnych oczu, w ktorych widac lekcewazenie i pozadanie smierci, ogarnia cie przerazenie.", oblist);
	all2act("podniosl zimny, przerazajacy wzrok na",oblist, PL_BIE);
	actor("Wlepiasz wzrok w",oblist, PL_BIE);
	return 1;
    }
    notify_fail("Zspojrz na kogo?\n");
    return 0;
}

int
zsmiech(string str)
{
    STR;
    all("zaczyna sie nagle trzasc. Z " + this_player()->koncowka("jego", "jej") +
	" gardla wydobywa sie dziwny charkot, ktory prawdopodobnie ma uchodzic za smiech.");
    write("Smiejesz sie do rozpuku.\n");
    return 1;
}

int
zpowitaj(string str)
{
    object *kogo;
    NO_STR("Poprawna skladnia: zpowitaj <kogo>\n");
    kogo=parse_this(str, "%l:"+PL_BIE);
    if (!sizeof(kogo))
	return notify_fail("Kogo chcesz powitac?\n");
    
    all2act("wyszczerza zeby w radosnym usmiechu, zamyka i", kogo, PL_BIE,
	    " w niedzwiedzim uscisku prawie lamiac "
	    + comp_zaimki(kogo, PL_CEL, 1) + " kosci.");
    target("wyszczerza do ciebie zeby w radosnym usmiechu i zamyka cie w " +
	   "niedzwiedzim uscisku prawie lamiac ci kosci.",kogo);
    actor("Sciskasz na powitanie",kogo,PL_BIE);
    return 1;
}

int 
zpozegnaj(string str)
{
    object *kogo;
    NO_STR("Poprawna skladnia: zpozegnaj <kogo>\n");
    if (!swoj()) return 0;
    
    kogo=parse_this(str, "%l:"+PL_BIE);
    if (!sizeof(kogo))
	return notify_fail("Kogo chcesz pozegnac?\n");

    all2act("wznosi " + swoj(PL_BIE) + " w strone", kogo, PL_DOP, 
	    ", polecajac " + comp_zaimki(kogo, PL_BIE, 0) + " opiece Throrina.");
    target("wznosi "+swoj(PL_BIE)+" w twoja strone, polecajac cie opiece Throrina.", kogo);
    actor("Wznosisz " + swoj(PL_BIE) + " w strone", kogo, PL_DOP,
	  ", polecajac "+comp_zaimki(kogo, PL_BIE, 0)+" opiece Throrina.");
    return 1;
}

int
zprzewies(string str)
{
    object *oblist, *oblist2;
    int a, tmp;
    
    NO_STR("Co chcesz przewiesic przez plecy?\n");

    oblist = parse_this(str, "%i:" + PL_BIE);

    if (!sizeof(oblist))
	return notify_fail("Co chcesz przewiesic przez plecy?\n");

    if (sizeof(oblist) > 1)
	return notify_fail("Mozesz przewiesic przez plecy tylko jedna rzecz.\n");

    if (oblist[0]->query_wt() != W_AXE)
	return notify_fail("Przez plecy mozesz przewiesic jedynie topor.\n");
    
    if (oblist[0]->query_wielded())
	return notify_fail("Aby przewiesic przez plecy dobywana bron uzyj komendy <zopusc>.\n");

    oblist2 = all_inventory(this_player());
    a = sizeof(oblist2);
    for (tmp = 0; tmp < a; tmp++)
    {
	if (oblist2[tmp]->query_subloc() == TOP_SUBL)
	    return notify_fail("Przez plecy masz juz przewieszon" +
			       oblist2[tmp]->koncowka("y ", "a ") + 
			       oblist2[tmp]->short(this_player(), PL_BIE) + ".\n");
    }

    this_player()->add_subloc(TOP_SUBL, this_object(), "plecy");

    oblist[0]->move(this_player(), TOP_SUBL);
    
    actor("Przewieszasz sobie przez plecy", ({oblist[0]}), PL_BIE);

    allbb("przewiesza sobie przez plecy " + QSHORT(oblist[0], PL_BIE) + ".");
    
    return 1;
}
    

int
zdobadz(string str)
{
    object *oblist, topor;
    int i, tmp;
    string nie_mozna;

    STR;

    oblist = all_inventory(this_player());
    i = sizeof(oblist);

    for (tmp = 0; tmp < i; tmp++)
    {
	if (oblist[tmp]->query_subloc() == TOP_SUBL)
	{
	    topor = oblist[tmp];
	    break;
	}
    }

    if (!objectp(topor))
	return notify_fail("Nie masz przewieszonego przez plecy zadnego topora.\n");
		
    nie_mozna = topor->wield_me(1);
    if (stringp(nie_mozna)) 
	return notify_fail(nie_mozna);
    if (!nie_mozna) 
	return notify_fail("Nie mozesz dobyc " + topor->short(PL_DOP)+".\n");

    all("zamaszystym, szybkim ruchem dobywa " + zaimki_dz(topor, PL_DOP) +
	" przewieszone" + topor->koncowka("go","j") + " przez plecy "+
	topor->short(PL_DOP) + " i staje w rozkroku unoszac " +
	topor->koncowka("go","ja") + " nad glowe.");

    write("Zamaszystym, szybkim ruchem dobywasz " + zaimki_dz(topor, PL_DOP) +
	  " przewieszone" + topor->koncowka("go","j") + " przez plecy " +
	  topor->short(PL_DOP) + " i stajesz w rozkroku unoszac " +
	  topor->koncowka("go","ja") + " nad glowe.\n");

    this_player()->remove_subloc(TOP_SUBL);
    return 1;
}

int
zopusc(string str)
{
    object bron, *bronie, *tmp;
    int i;
    bronie=({this_player()->query_weapon(W_RIGHT), 
	     this_player()->query_weapon(W_LEFT),
	     this_player()->query_weapon(W_BOTH)}) - ({0});

    for (i = sizeof(bronie) - 1; i >= 0; i--)
    {
	if (bronie[i]->query_wt() != W_AXE)
	    bronie -= ({bronie[i]});
    }

    if (!sizeof(bronie))
	return notify_fail("Aby moc to zrobic, musisz wczesniej miec dobyty topor!\n");

    if (!str)
	bron=bronie[0];
    else
    {
	parse_command(str, bronie, "%i:"+PL_BIE, tmp);
	bronie=NORMAL_ACCESS(tmp, 0, 0);
	TP->set_obiekty_zaimkow(bronie);
	if (!sizeof(bronie))
	    return notify_fail("Nie dobywasz takiej broni!\n");
	bron=bronie[0];
    }

    bronie = all_inventory(this_player());

    for (i = 0; i < sizeof(bronie); i++)
    {
	if (bronie[i]->query_subloc() == TOP_SUBL)
	    return notify_fail("Przez plecy masz juz przewieszon" +
			       bronie[i]->koncowka("y ", "a ") + 
			       bronie[i]->short(this_player(), PL_BIE) + ".\n");
    }

    bron->set_wf(this_object());
    bron->unwield_me();
    this_player()->add_subloc(TOP_SUBL, this_object(), "plecy");
    bron->move(this_player(), TOP_SUBL);
    
    write("Rozgladajac sie dookola z mina pelna niepewnosci"+
	  " przewieszasz przez plecy "+bron->short(PL_BIE)+". Czujesz, "+
	  "jak bardzo bedzie ci "+bron->koncowka("go","jej")+" brakowac.\n");
    all("rozgladajac sie do okola z pelna niepewnosci mina "+
	"przewiesza przez plecy "+zaimki_dz(bron, PL_BIE)+" "+
	bron->short(PL_BIE)+". Wyraz jego twarzy pokazuje, jak bardzo "+
	"mu "+bron->koncowka("go","jej")+" brakuje.");
    return 1;
}

int
zzdejmij(string str)
{
    object *oblist, bron;
    int a, tmp;

    STR;
    
    oblist = all_inventory(this_player());
    a = sizeof(oblist);
    
    for (tmp = 0; tmp < a; tmp++)
    {
	if (oblist[tmp]->query_subloc() == TOP_SUBL)
	{
	    bron = oblist[tmp];
	    break;
	}
    }
    
    if (!objectp(bron))
	return notify_fail("Nie masz przewieszonej przez plecy zadnej broni.\n");
    
    bron->move(this_player());
    this_player()->remove_subloc(TOP_SUBL);

    actor("Zdejmujesz z plecow", ({bron}), PL_BIE);
    allbb("zdejmuje z plecow " + QSHORT(bron, PL_BIE) + ".\n");
    
    return 1;
}

int
unwield()
{
    return 1;
}

int
zprzydus(string str)
{
    object *oblist;
    NO_STR("Kogo chcesz przydusic?\n");

    oblist = parse_this(str, "%l:" + PL_BIE);

    if (!sizeof(oblist))
    {
	notify_fail("Kogo chcesz przydusic?\n");
	return 0;
    }

    if (sizeof(oblist) > 1)
    {
	notify_fail("Kogo konkretnie chcesz pozbawic powietrza?\n");
	return 0;
    }

    actor("W porywie naglej wscieklosci przyskakujesz do", oblist, PL_DOP, " i lapiesz " +
	  oblist[0]->koncowka("go", "ja", "je") + " reka za krtan, mierzac " +
	  "straszliwym wzrokiem.");

    say("Nagle " + QIMIE(this_player(), PL_MIA) + " zadziwiajaco szybkim ruchem " +
	"przyskakuje do " + QIMIE(oblist[0], PL_DOP) + " i zamyka swa dlon na " + 
	oblist[0]->koncowka("jego", "jej", "jego") + " krtani w zelaznym uscisku. " + 
	QCIMIE(oblist[0], PL_CEL) + " oczy wychodza z orbit, a " + QIMIE(this_player(), PL_MIA) + 
	" przyglada " + oblist[0]->koncowka("mu", "jej", "mu") + " sie przez chwile " +
	"z msciwa satysfakcja, po czym odpycha " + oblist[0]->koncowka("go", "ja", "je") +
	" w tyl, wykrzywiajac sie pogardliwie.\n", ({this_player(), oblist[0]}));

    oblist[0]->catch_msg("Nagle " + QIMIE(this_player(), PL_MIA) + " zadziwiajaco " +
			 "szybkim ruchem przyskakuje do ciebie i zamyka swa dlon na twej " +
			 "krtani w zelaznym uscisku. Czujesz, jak oczy wychodza ci z " +
			 "orbit, a " + QIMIE(this_player(), PL_MIA) + " przyglada ci sie " +
			 "przez chwile straszliwym, bezlitosnym wzrokiem. Na moment " +
			 this_player()->koncowka("jego", "jej", "jego") + " twarz wykrzywia " +
			 "sie w grymasie politowania, po czym chwyt rozluznia sie i " +
			 "zostajesz brutalnie odepchniet" + oblist[0]->koncowka("y", "a", "e") +
			 " w tyl.\n");
    
    return 1;
}

int
zzatwierdzeni(string str)
{
    string *strlist = ADMIN_OB->query_zatwierdzeni();
    int a, tmp;
    STR;

    a = sizeof(strlist);
    if (!a)
    {
	write("W tej chwili jestes jedynym czlonkiem zabojcow.\n");
	return 1;
    }

    write("W tej chwili oprocz ciebie do Zabojcow naleza:\n");
    for(tmp = 0 ; tmp < a ; tmp++)
	write(capitalize(strlist[tmp]) + " ");
    write("\n");

    return 1;
}

int
zscisnij(string str)
{
    object *oblist;
    
    NO_STR("Zacisnij rece na czym?\n");
    
    oblist = parse_this(str, "'rece' 'na' %i:" + PL_NAR);
    
    if (sizeof(oblist) != 1)
    {
    	notify_fail("Zzacisnij rece na czym?\n");
    	return 0;
    }
    
    if (oblist[0]->query_wt() != W_AXE)
    {
    	notify_fail("Mozesz zacisnac rece jedynie na toporze.\n");
    	return 0;
    }
    
    this_player()->catch_msg("Zaciskasz dlonie na trzonku " + QSHORT(oblist[0], PL_DOP) + 
    	" z taka sila i zawzietoscia, ze az bieleja ci kostki palcow.\n");
    	  
    say(QCIMIE(this_player(), PL_MIA) + " zaciska dlonie na trzonku " +
    	QSHORT(oblist[0], PL_DOP) + " z taka sila i zawzietoscia, ze az " +
    	"bieleja " + this_player()->koncowka("mu", "jej") + " kostki palcow.\n");
    	
    return 1;
}

int
zprzesun(string str)
{
     object *oblist;
     
     NO_STR("Zprzesun po czym?\n");
     
     oblist = parse_this(str, "'po' %i:" + PL_NAR);
     
    if (sizeof(oblist) != 1)
    {
     	notify_fail("Zprzesun po czym?\n");
     	return 0;
    }
    
    if (oblist[0]->query_wt() != W_AXE)
    {
        notify_fail("Mozesz to zrobic tylko z toporem.\n");
        return 0;
    }
    
    this_player()->catch_msg("Przesuwasz kciukiem po ostrzu " + QSHORT(oblist[0], PL_DOP) +
                             ", az zalsnila na nim kropla krwi.\n");
                             
    say(QCIMIE(this_player(), PL_MIA) + " przesuwa kciukiem po ostrzu " +
        QSHORT(oblist[0], PL_DOP) + ", az zalsnila na nim kropla krwi.\n");
        
    return 1;
}

int
zpomoc(string str)
{
    STR;
    write("Komendy zabojcow: \n"+
	  "\t- zatak [kogo]\n\t\t- zprzesun po <czym>"+
	  "\t- zczysc\n\t\t- zzacisnij rece na <czym>"+
	  "\t- zokrzyk\n"+
	  "\t- zpowitaj <kogo>\n"+
	  "\t- zpozegnaj <kogo>\n"+
	  "\t- zsmiech\n"+
	  "\t- zspojrz\n"+
	  "\t- zzamierz sie na <kogo>\n"+
	  "\t- zzapasc\n"+
	  "\t- zdobadz [czego]\n"+
	  "\t- zopusc [co]\n"+
	  "\t- zprzewies <co>\n" +
	  "\t- zzdejmij\n" +
	  "\t- zprzydus <kogo>\n" + 
	  (this_player()->query_real_name() == ADMIN_OB->query_szef() ?
	   "\t- zzatwierdzeni\n" : "" ) +
	  "\n");
    return 1;
}

void
init_emoty()
{
    add_action(zpozegnaj, "zpozegnaj");
    add_action(zpowitaj, "zpowitaj");
    add_action(zsmiech, "zsmiech");
    add_action(zspojrz, "zspojrz");
    add_action(zzamierz, "zzamierz");
    add_action(zzapasc, "zzapasc");
    add_action(zczysc, "zczysc");
    add_action(zokrzyk, "zokrzyk");
    add_action(zatak, "zatak");
    add_action(zopusc,"zopusc");
    add_action(zdobadz,"zdobadz");
    add_action(zpomoc, "zpomoc");
    add_action(zprzewies, "zprzewies");
    add_action(zzdejmij, "zzdejmij");
    add_action(zprzydus, "zprzydus");
    add_action(zzacisnij, "zzacisnij");
    add_action(zprzesun, "zprzesun");
    if (this_player()->query_real_name() == ADMIN_OB->query_szef())
	add_action(zzatwierdzeni, "zzatwierdzeni");
}

