/* plik systemowy dla gwardzistow
 *
 *
 * Autor: Odenaj
 */

#include "defs.h"

static int spec_zbroja = 0,
           spec_disarm = 0,
           spec_hurt = 0;


int
query_spec_zbroja()
{
	return spec_zbroja;
}

void
set_spec_zbroja(int i)
{
	spec_zbroja = i;
}

int
query_spec_disarm()
{
	return spec_disarm;
}

void
set_spec_disarm(int i)
{
	spec_disarm = i;
}

int
query_spec_hurt()
{
	return spec_hurt;
}

void
set_spec_hurt(int i)
{
	spec_hurt = i;
}


void
check_heal(object kto)
{
	object *npc = ({});
	object *przyjaciele = ({});
	object *wrogowie = ({});
	object *widzowie = ({});
	object best_zaslona;
	int best_hp = 0;
	int i;

	npc = FILTER_LIVE(I(E(kto)));

	for(i=0; i<sizeof(npc); i++)
	{
		if(npc[i]->query_prop(GWARDIA_QUERIQUE))
		   przyjaciele += ({ npc[i] });
	}

	przyjaciele -= ({ kto });
	if(!sizeof(przyjaciele)) return;

	for(i=0; i<sizeof(przyjaciele); i++)
	{
		if(przyjaciele[i]->query_hp() > best_hp)
		{
			best_hp = przyjaciele[i]->query_hp();
			best_zaslona = przyjaciele[i];
		}

	}

	if(best_hp > kto->query_hp())
	{
		for(i=0; i<sizeof(npc); i++)
		{
			if(npc[i]->query_attack() == kto)
			{
				wrogowie += ({ npc[i] });
				npc[i]->attack_object(best_zaslona);
				npc[i]->catch_msg(QCIMIE(best_zaslona, PL_MIA) +
				                  " wskakuje miedzy ciebie a " +
				                  QIMIE(kto, PL_BIE) + " zaslaniajac " +
				                  kto->koncowka("go", "ja") +
				                  " przed twoimi ciosami!\n");
			}
		}

		kto->catch_msg(QCIMIE(best_zaslona, PL_MIA) + " zrecznie zaslania "+
		               "cie przed ciosami " +
		               FO_COMPOSITE_LIVE(kto, wrogowie, PL_DOP) + "!\n");
		best_zaslona->catch_msg("Zrecznie zaslaniasz " + QIMIE(kto, PL_BIE) +
		               " przed ciosami " + FO_COMPOSITE_LIVE(best_zaslona,
		                wrogowie, PL_DOP) + "!\n");
		widzowie = npc;
		widzowie -= wrogowie;
		widzowie -= ({ kto, best_zaslona });
		for(i=0; i<sizeof(widzowie); i++)
		{
			widzowie[i]->catch_msg(QCIMIE(best_zaslona, PL_MIA) +
			            " zrecznie zaslania "+
		                QIMIE(kto, PL_BIE) + " przed ciosami " +
		                FO_COMPOSITE_LIVE(widzowie[i], wrogowie, PL_DOP) +
		                "!\n");
		}


	}
}

void
wesprzyj_gwardie(object kogo)
{
	string *okrz_m, *okrz_k;

	okrz_m = ({"", ""});
	okrz_k = ({"", ""});

	command("wesprzyj " + OB_NAME(kogo));
	if(random(10) > 4) return;

	if(kogo->query_gender() == G_FEMALE)
	   command(okrz_k[random(sizeof(okrz_k))]);
	else
	   command(okrz_m[random(sizeof(okrz_m))]);
}

void
attacked_by(object gracz)
{
//	FILTER_LIVE(I(E(TO)))->wesprzyj_gwardie(TO);
	TO->attacked_by(gracz);
}

int
spec_zbroja(object enemy)
{
	object *armoury;
	object zbroja, bron;

	if(!query_spec_zbroja()) return 0;

	if(!sizeof(armoury = enemy->query_armour(-1))) return 0;

	bron = TO->query_weapon(W_LEFT);
	if(!objectp(bron)) bron = TO->query_weapon(W_RIGHT);
	if(!objectp(bron)) bron = TO->query_weapon(W_BOTH);
	if(!objectp(bron)) return 0;

	zbroja = armoury[random(sizeof(armoury))];

	TO->catch_msg("Zniszczyles zbroje: " + capitalize(enemy->query_real_name()) +
	              " : " + MASTER_OB(zbroja) + "\n");
	enemy->catch_msg(TO+" wyprowadza potezny zamach z nad glowy swym "+
	                 bron->query_short(PL_NAR)+" i szybkim wymachem "+
	                 "trafia cie w "+zbroja->query_short(PL_BIE)+
	                 ". Slyszysz odglos lamiacej"+
	                 "sie stali,a po chwili uswiadamiasz sobie iz jest to "+
	                 "twoja zbroja! Na twarzy "+QIMIE(TO,PL_DOP)+"pojawia sie ledwie "+
	                 "zauwazalny grymas zadowolenia.\n");

	tell_room(E(TO), TO+" wyprowadza potezny zamach z nad glowy swym "+
	                bron->query_short(PL_NAR)+" i szybkim wymachem "+
	                " trafia "+QIMIE(TP,PL_DOP)+" w "
	                +zbroja->query_short(PL_BIE)+", ktory pod "+
	                "wplywem nienaturalnie silnego uderzenia rozpada sie na "+
	                "male kawaleczki. Na twarzy "+QIMIE(TO,PL_DOP)+"zauwazasz "+
	                "dziwny grymas.\n", ({ TO, enemy}));

	zbroja->remove_broken(-1);

	return 1;
}

int
spec_hurt(object enemy)
{
	mixed *hitresult;
	object bron;
	int pen = 0;
	string jak;

	if(!query_spec_hurt()) return 0;

	bron = TO->query_weapon(W_LEFT);
	if(!objectp(bron)) TO->query_weapon(W_RIGHT);
	if(!objectp(bron)) TO->query_weapon(W_BOTH);
	if(!objectp(bron)) return 0;

#ifdef PEN_SPECA
    pen = PEN_SPECA;
#endif

    if(!pen) pen = 100;


	hitresult = enemy->hit_me(pen, bron->query_at(), 30, TO, -1);
	switch(hitresult[0])
	{
		case -1..0: jak = "nie trafia";
		            break;
		case 1..4:  jak = "ledwo muska";
		            break;
		case 5..13:  jak = "lekko rani";
		            break;
		case 14..20: jak = "rani";
		            break;
		case 21..31: jak = "mocno rani";
		            break;
		case 32..55: jak = "ciezko rani";
		            break;
		case 56..99: jak = "masakruje";
	                break;
	    default: jak = "masakruje bezlitosnie";
	}

	TO->catch_msg("Walnales speca w " + enemy->query_real_name() + " za " +
	              hitresult[3] + "hp. Twoj pen to: " + pen + "\n");
	enemy->catch_msg(QCIMIE(TO, PL_MIA) + " wykonuje potezne uderzenie " +
	                 bron->koncowka("swoim", "swoja") + " " +
	                 bron->query_short(PL_BIE) + " i " + jak + " cie!\n");
	tell_room(E(TO), QCIMIE(TO, PL_MIA) + " wykonuje potezne uderzenie " +
	                 bron->koncowka("swoim", "swoja") + " " +
	                 bron->query_short(PL_BIE) + " i " + jak + " " +
	                 QIMIE(enemy, PL_BIE) + ".\n", ({ TO, enemy}));
	if(enemy->query_hp() < 1) enemy->do_die(TO);

	return 1;

}

int spec_disarm(object enemy)
{
	object *enemy_weapons;
	object bron, hands;
	object shadow;
	object bron_prawa;

	if(!query_spec_disarm()) return 0;

    if(!sizeof(enemy->query_weapon(-1))) return 0;

    enemy_weapons = enemy->query_weapon(-1);
    bron = enemy_weapons[random(sizeof(enemy_weapons))];

    hands = bron->query_attack_id();

    TO->catch_msg("Mocnym kopnieciem wytraciles bron " + QIMIE(enemy, PL_CEL) + ".\n");
    enemy->catch_msg("ktostam wytracil ci bron z reki, ale boli blabla\n");

    tell_room(E(TO), "Ktostam wytracil bron komustam.\n" , ({ enemy, TO}));

    set_this_player(enemy);
    bron->unwield_me();
    set_this_player(TO);
	setuid();
	seteuid(getuid());
	shadow = clone_object(SCIEZKA +"wield_shadow");
	shadow->shadow_me(enemy);
	shadow->disarm_hand(hands,itof(5 + random(15)));

	return 1;
}

int
special_attack(object enemy)
{
	int i, suma = 0;
	int *spece;
	if(random(6)) return 0;

	spece = ({ query_spec_hurt(), query_spec_disarm(), query_spec_zbroja() });

	for(i=0; i<sizeof(spece); i++)
	{
		suma += spece[i];
	}
	if(!suma) return 0;

	while(suma)
	{
		if(spece[i = random(sizeof(spece))]) continue;
		switch(i)
		{
			case 0: if(spec_hurt(enemy)) return 1;
			case 1: if(spec_disarm(enemy)) return 1;
			case 2: if(spec_zbroja(enemy)) return 1;
			default: return 0;
		}

	}
}