dodaj_paraliz(object komu, int czas);

int
oglusz(string str)
{
    object *oblist, cel;
    object mlot=TP->query_weapon(W_RIGHT) || TP->query_weapon(W_BOTH);
    float czas;
    
    if(stringp(str))
    {
		oblist = parse_this(str, "%l:" + PL_BIE);
	
		if(!sizeof(oblist))
		{
	    	notify_fail("Kogo chcesz ogluszyc?\n");
	    	return 0;
		}
	
		if(sizeof(oblist) > 1)
		{
	    	notify_fail("Mozesz ogluszac jedna osobe na raz.\n");
	    	return 0;
		}
		cel = oblist[0];
    }
    else // Nie podano celu
    {
		cel = TP->query_attack();
    }
    
    if (!cel)
    {
    	notify_fail("Kogo chcesz ogluszyc?\n");
    	return 0;
    }
    
  /*if (member_array (TP, cel->query_enemy(-1)) == -1)
    {
	notify_fail("Tego ciosu mozesz uzywac tylko podczas "
		    +"walki.\n");
	return 0;
    } */
    
    if (obiekt_no_attack(TP, cel)) return 0; // Niestety, wszystko jest 
    	// jako .h, wiec nie mozna wkleic tego tutaj. Uzywamy w zwiazku 
    	// z tym funkcji zdeklarowanej w szarzy. Dziala, ale niezbyt zgodne z 
    	// idea czystego programowania. ( jak kto bedzie tej funkcji szukal...
    
    
    if (this_player()->query_prop(RZ_SPECJAL))
    {
	notify_fail("Musisz chwile odpoczac, zanim bedziesz mogl znow"
		    +" uzyc ciosu specjalnego.\n");
	return 0;
    }
    
    if (!mlot)
    {
	notify_fail("Musisz dzierzyc mlot, aby moc kogos ogluszyc.\n");
	return 0;
    }
    if (!(mlot->query_wt() == W_WARHAMMER))
    {
	notify_fail("Ogluszac mozesz tylko i wylacznie mlotem bojowym, rytualna "
		    +"bronia Rycerzy Zakonu Sigmara.\n");
	return 0;
    }
    if (!TP->query_skill(RZ_OGLUSZANIE))
    {
	notify_fail("Nie znasz nawet podstaw tej techniki walki.\n");
	return 0;
    }
    if (TP->query_prop(RZ_TEMP))
    {
	// Mor: Ten opis powinien dotyczyc wszystkich specjali
	// ow prop jest sprawdzany przy kazdym (Silvy popraw to bo nic nie moge wymyslec)
	notify_fail("Wlasnie przygotowujesz sie do zadania ciosu.\n");
	return 0;
    }
    
    
    czas = (400.0 - 3.0 * itof(TP->query_skill(RZ_OGLUSZANIE))) / 100.0;

// W tym miejscu Morley dal rozpoczecie walki, ale to bylo troche nie fer.
// Dalej i tak to sprawdza, wiec jest ok.
    
    write("Koncentrujesz sie, wypatrujac okazji do zadania "
	  +"przeciwnikowi ogluszajacego ciosu.\n");
    TP->add_prop(RZ_TEMP, set_alarmv(czas, 0.0, "oglusz_go",
				     ({this_player(), cel, mlot})));
    return 1;
    TP->add_prop(LIVE_O_SPELL_ATTACK, clone_object(ENGINE+"spec_ogl"));
    
}

void
oglusz_go(object kto, object kogo, object mlot)
{
    string opis = mlot->short(PL_NAR);

    kto->remove_prop(RZ_TEMP);

    if (mlot != kto->query_weapon(W_RIGHT) && mlot != kto->query_weapon(W_BOTH))
    {
	kto->catch_msg("Nie mozesz zmieniac broni podczas "
		       +"przygotowywania sie do zadania ciosu.\n");
	return;
    }

    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)
    {
   	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, set_alarm(PRZERWA, 0.0, "usun_specjala", kto));
    
    if (trafil_ogluszanie (kto, kogo, mlot->query_wt(), RZ_OGLUSZANIE))
    {
	int zly_efekt,efekt, czas, pr_efekt;
	int ile_ciosow=kto->query_prop(ILE_CIOSOW_OGLUSZENIA);
	string opis_ef;
	efekt = sila_ciosu(kto, kogo, RZ_OGLUSZANIE, A_HEAD)*ile_ciosow;
	efekt-=(zly_efekt=80 - 7/10 *kto->query_skill(RZ_OGLUSZANIE) * efekt);
	kogo->heal_hp(-zly_efekt);		
	pr_efekt = (efekt * 100) / (kogo->query_hp() - kogo->query_prop(P_OGL));
	kto->remove_prop(LIVE_O_SPELL_ATTACK);
	kto->remove_prop(ILE_CIOSOW_OGLUSZENIA);
	if (pr_efekt < 0)
	    pr_efekt = 100;
	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 = "";
	    break;
	    
	case 17..35:
	    opis_ef = "mocno ";
	    break;
	    
	case 36..60:
	    opis_ef = "bardzo mocno ";
	    break;
	    
	default:
	    opis_ef = "poteznie ";
	}
	
	kto->catch_msg("Wykorzystujac sposobna sytuacje " + opis_ef + "uderzasz " + 
	               QIMIE(kogo, PL_BIE) + " w glowe, probujac " + 
	               kogo->koncowka("go", "ja", "je") + " ogluszyc.\n"); 
	tell_room(environment(kto), "Nieoczekiwanie " + QIMIE(kto, PL_MIA) + " " +
	          opis_ef + "uderza " + QIMIE(kogo, PL_BIE) + " " + opis +
	          " w glowe, probujac " + kogo->koncowka("go", "ja", "je") +
	          " ogluszyc.\n", ({kto, kogo}));
	kogo->catch_msg("Nieoczekiwanie " + QIMIE(kto, PL_MIA) + " " + opis_ef +
	                "uderza cie " + opis + " w glowe, probujac cie ogluszyc.\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);
	    dodaj_paraliz(kogo,czas);
	}
	return;
    }
    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," ale chybiasz.");
    return;
}

dodaj_paraliz(object komu, int czas)
{
    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);
}

void
heal_ogluszenie(object komu)
{
    int heal = F_HEAL_FORMULA(komu->query_stat(SS_CON), -komu->query_intoxicated());
    
    heal = 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);
}
