inherit "/cmd/std/command_driver";

#include "mith.h"
#include "ryc_zak.h"
#include "funkcje.h"

#define LIVE_I_NO_FLESH "_live_i_no_flesh"

void heal_ogluszenie(object komu);

int filt_fun(object ob)
{
   return !ob->query_prop(OBJ_M_NO_GET) && !ob->query_no_show()
	     && !ob->query_prop(OBJ_M_NO_STEAL)&&
	        !ob->query_prop(OBJ_M_NO_DROP);
}

dodaj_paraliz(object komu, int czas, object ja)
{
    object p, cialo, *inv;

    setuid();
    seteuid(getuid());
    p = clone_object(RYCERZ+"paraliz");
    p->set_stop_object(p);
    p->set_stop_fun("stop_paralize");
    p->set_stop_message("Odzyskujesz przytomnosc.\n");
    p->set_fail_message("Jestes ogluszony, dopoki nie "
			+"odzyskasz przytomnosci nie mozesz nic robic.\n");
    if (czas>20) czas = 20;
    p->set_remove_time(czas);
    komu->stop_fight(komu->query_attack());
    p->move(komu, 1);
    komu->add_prop(RZ_O_PARALIZ, p);

    remove_alarm(komu->query_prop(P_HEAL_OGL)); // Zatrzymanie leczenia
    komu->remove_prop(P_HEAL_OGL);              // punktow ogluszenia

    cialo = clone_object(RZ_TEMP_CIALO);        // Zastapienie obiektu gracza
    cialo->move(environment(komu), 1);          // kontenerem z jego rzeczami
    cialo->ustaw_cialo(komu);
    komu->add_prop(RZ_O_CIALO, cialo);
    
    inv = all_inventory(komu);
    inv = filter(inv, &filt_fun());
    inv->move(cialo, 1);
    
    komu->move(RZ_OGL_ROOM, 1);
}


spell_attack(object kto, object kogo)
{
    object mlot, zbroja;    
    string opis, hitloc;
    int czym, efekt, gdzie;
    mixed wynik;
    set_this_player(kto);
    if (mlot = kto -> query_weapon(W_RIGHT))
    	czym = W_RIGHT;
    else if (mlot = kto->query_weapon(W_BOTH))
    	czym = W_BOTH;
    else if (mlot = kto->query_weapon(W_LEFT))
    	czym = W_LEFT;
    opis=mlot->short(PL_NAR);
    
    kto->remove_prop(RZ_TEMP);

    if (!present(kogo,environment(kto)))
    {
	kto->catch_msg("Osoby, ktora chciales ogluszyc nie ma kolo"
		       +" ciebie.\n");
	return;
    }

 /*   if (!kto->query_attack() && kto!=kogo->query_attack())
    {
	kto->catch_msg("Ogluszac mozesz tylko podczas walki.\n");
	return;
    }*/
        
    if (!(mlot->query_wt()==W_WARHAMMER))
    {
   	kto->catch_msg("Aby moc ogluszac przeciwnika, musisz dzierzyc"
		       +" mlot.\n");
	return;
    }
    
    if (member_array (kogo, kto->query_enemy(-1) ) == -1)
        kto->attack_object(kogo);

    kto->catch_msg("Bierzesz potezny zamach, starajac sie ogluszyc "+kogo->query_imie(kto, PL_BIE)+".\n");
    kto->add_prop(RZ_SPECJAL, 1);
    
    kto->add_prop(LIVE_O_SPELL_ATTACK, this_object());
    kto->add_prop(LIVE_I_NO_FLESH, 1);

    wynik = sila_ciosu(kto, kogo, RZ_OGLUSZANIE, A_HEAD);
    if (objectp(wynik))
    {
	zbroja=wynik;
	efekt=0;
    }
    else efekt=wynik;
    gdzie=A_HEAD;
    if (!sizeof(kogo->query_combat_object()->query_hitloc(gdzie)))
       gdzie=kogo->query_combat_object()->query_hitloc_id()[0];
    
    /* Jesli przeciwnik nie mial hitlokacji 'glowa', to byl runntime.
       Teraz hitlokacja bedzie pierwsza z posiadanych. 
       Jakoze zawsze jest conajmiej 1 hitlokacja, runtimow byc 
       niepowinno. Tigr */
       
    hitloc=(kogo->query_combat_object()->query_hitloc(gdzie))[2];
    wynik=trafil_ogluszanie (kto, kogo, czym);
    wynik[3]->cb_update_combat();
    if (wynik[0] > 0 /*&& efekt > 0*/)
    {
	int zly_efekt, pr_efekt, czas;
	string opis_ef;
	int real_hp;
//	efekt-=(zly_efekt=(80 - 7/10 * kto->query_skill(RZ_OGLUSZANIE)) * efekt/100);
//	kogo->heal_hp(-zly_efekt);		
	kogo->add_prop(P_OGL, kogo->query_prop(P_OGL) + efekt);
	pr_efekt = (efekt * 100 / (kogo->query_hp()-kogo->query_prop(P_OGL)));
	if (pr_efekt<0) pr_efekt=100;
        wynik[3]->cb_did_hit(wynik[2], hitloc, pr_efekt, kogo, kto->query_prop(DT_OGLUSZANIE));
       	if (kogo->query_hp()<=0) 
       	{
       		kogo->do_die(kto);
       		return;
       	}
	real_hp=kogo->query_hp() - kogo->query_prop(P_OGL);
	pr_efekt =(real_hp) ? (efekt * 100 / real_hp) : 100;
	if (pr_efekt <= 0)
	    pr_efekt = 100;
	write_file(LOG_CIOSOW, 
		sprintf("Efekt: %-5d Obrazenia: %-5dHP: %-5dP.Ogl: %-5d",
			 efekt, zly_efekt, kogo->query_hp(),
			kogo->query_prop(P_OGL)));
/*	if (efekt == 0)
	{
	    target("niespodzianie uderza cie " + opis + " w glowe, "
		   +"nie wyrzadzajac ci jednak zadnej szkody.",
		   ({kogo}));
	    all2act("niespodziewanie uderza ",({kogo}),PL_BIE," " +
	            opis + " w glowe, nie wyrzadzajac "
	            + kogo->query_zaimek(PL_CEL) + " zadnej szkody.");
	    actor("Uderzasz", ({kogo}), PL_BIE, " w glowe, nie " +
	          "wyrzadzajac "+kogo->query_zaimek(PL_CEL)
	          +" zadnej szkody.");

			return;
	}
	
	switch (pr_efekt)
	{
	case 0..6:
	    opis_ef = "lekko ";
	    break;
	    
	case 7..16:
	    opis_ef = "troche ";
	    break;
	    
	case 17..35:
	    opis_ef = "mocno ";
	    break;
	    
	case 36..60:
	    opis_ef = "bardzo mocno ";
	    break;
	    
	default:
	    opis_ef = "poteznie ";
	}
	
	kto->catch_msg("Umiejetnie zadany cios " + opis_ef + kogo->koncowka("go", "ja", "je") + " oglusza.\n"); 
	tell_room(environment(kto), "Umiejetnie zadany cios " + opis_ef + kogo->koncowka("go", "ja", "je") +
	          " oglusza.\n", ({kto, kogo}));
	kogo->catch_msg("Czujesz, jak umiejetnie zadany cios "+ opis_ef +
		"cie oglusza.\n");
 */


	if (!kogo->query_prop(P_HEAL_OGL))
	    kogo->add_prop(P_HEAL_OGL, set_alarm(60.0, 60.0, &heal_ogluszenie(kogo)));

	if (kogo->query_hp() <= kogo->query_prop(P_OGL))
	{
	    kogo->catch_msg("Robi ci sie ciemno przed oczyma.\n");
	    actor("Nieprzytomn"+
	    	kogo->koncowka("y","a","e","i","e"), ({kogo}), PL_MIA, " pada na ziemie.");
	    tell_room(environment(kogo), QCIMIE(kogo,PL_MIA)
		      +" pada na ziemie nieprzytomn"+
		      kogo->koncowka("y","a","e","i","e")+".\n",({kto,kogo}));
	    czas = 20 - kogo->query_fatigue() * 10 / kogo->query_max_fatigue();
	    kto->stop_fight(kogo);
	    kto->remove_prop(LIVE_O_SPELL_ATTACK);
	    kto->remove_prop(RZ_SPECJAL);
	    kto->remove_prop(LIVE_I_NO_FLESH);
	    dodaj_paraliz(kogo,czas, kto);
	    loguj_cios(sprintf("Ogluszyl. HP: %-7d P.Ogl: %-7d Max HP: %-7dCzas: %d\n",
	    		kogo->query_hp(), kogo->query_prop(P_OGL), kogo->query_max_hp(), czas), !kogo->query_npc());
	}
	return;
    }
    if (wynik[0]<1) efekt = 0;
    if (!pointerp(wynik[1])) wynik[1]=({0,0,0,0,0});
    wynik[3]->cb_did_hit(wynik[2], hitloc, efekt, kogo, kto->query_prop(DT_OGLUSZANIE), wynik[0], 0, 0, wynik[1][2], zbroja );

/*    target("niespodziewanie zamierza sie na ciebie "+
	   mlot->koncowka("swoim ","swoja ")+opis+", ale haniebnie chybia",
	   ({kogo}));
    all2act("niespodziwewanie zamierza sie na ",({kogo}),PL_BIE," "+opis
            +" ale haniebnie chybia.");
    actor("Zamierzasz sie na",({kogo}),PL_BIE," " + 
    	mlot->koncowka("swoim ","swoja ") + opis+ ",ale chybiasz.");
*/
    return;
}


void
heal_ogluszenie(object komu)
{
    int heal = F_HEAL_FORMULA(komu->query_stat(SS_CON), -komu->query_intoxicated());
    
    if (heal<0) heal=0;
    
    if (heal > komu->query_prop(P_OGL))
    {
	remove_alarm(komu->query_prop(P_HEAL_OGL));
	komu->remove_prop(P_OGL);
	komu->remove_prop(P_HEAL_OGL);
	return;
    }

    komu->add_prop(P_OGL, komu->query_prop(P_OGL) - heal);
}
