inherit "/cmd/std/command_driver";

#include "mith.h"
#include "ryc_zak.h"
#include "funkcje.h"

dodaj_paraliz(object komu, int czas, object ja)
{
    object p, cialo, *inv;
    int tmp, s;

    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.");
    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);
    s = sizeof(inv);
    for (tmp = 0 ; tmp < s ; tmp++)
    {
	if ( !inv[tmp]->query_prop(OBJ_M_NO_GET) && !inv[tmp]->query_no_show()
	     && !inv[tmp]->query_prop(OBJ_M_NO_STEAL) )
	    inv[tmp]->move(cialo, 1);
    }    
    
    komu->move(RZ_OGL_ROOM, 1);
}


spell_attack(object kto, object kogo)
{
    object mlot, zbroja;    
    string opis, hitloc;
    int czym, efekt;
    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->add_prop(RZ_SPECJAL, 1);
    
    kto->add_prop(LIVE_O_SPELL_ATTACK, this_object());

    wynik = sila_ciosu(kto, kogo, RZ_OGLUSZANIE, A_HEAD);
    if (objectp(wynik))
    {
	zbroja=wynik;
	efekt=0;
    }
    else efekt=wynik;
    hitloc=kogo->query_combat_object()->query_hitloc(A_HEAD)[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);
	pr_efekt = (zly_efekt * 100 / kogo->query_hp());
	kogo->heal_hp(-zly_efekt);		
        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("ToHit: %-5d Efekt: %-5d Obrazenia: %-5dHP: %-5dP.Ogl: %-5d",
			mlot->query_hit(), 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");
 
	kogo->add_prop(P_OGL, kogo->query_prop(P_OGL) + efekt);

	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("Nieprzytomny", ({kogo}), PL_MIA, " pada na ziemie.");
	    tell_room(environment(kogo), QCIMIE(kogo,PL_MIA)
		      +" pada na ziemie nieprzytomny.\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);
	    dodaj_paraliz(kogo,czas, kto);
	    write_file(LOG_CIOSOW, 
	    	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));
	}
	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);
}
